تعريف الواجهة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 13 من 68.
الآن بعد أن فهمت ما هي الواجهات (interfaces) من الناحية المفاهيمية، دعنا نتعلم كيفية تعريف واحدة فعلياً في لغة Go. يتم تعريف الواجهة باستخدام الكلمة المفتاحية interface متبوعة بمجموعة من تواقيع الدوال (method signatures) المحاطة بأقواس متعرجة.
إليك الصيغة الأساسية لتعريف الواجهة (interface):
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}لاحظ أن الواجهة (interface) تحتوي فقط على تواقيع الدوال (method signatures) - اسم الدالة، والمعاملات، وأنواع الإرجاع - ولكن بدون تنفيذ (implementation). لا تحدد الواجهة كيفية عمل هذه الدوال، بل تحدد فقط الدوال التي يجب أن تكون موجودة.
على سبيل المثال، إليك كيفية تعريف واجهة Shaper بسيطة تتطلب من أي نوع يقوم بتنفيذها أن يحتوي على طريقة Area:
type Shaper interface {
Area() float64
}تحدد هذه الواجهة عقداً: أي نوع يريد أن يُعتبر Shaper يجب أن يمتلك دالة Area لا تأخذ أي معاملات وتُرجع float64. لا تهتم الواجهة بنوع البيانات أو كيفية حساب المساحة - كل ما يهمها هو وجود الدالة بالتوقيع (signature) الصحيح.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلفي هذا التحدي، ستتدرب على تعريف الواجهات (interfaces) في لغة Go من خلال إنشاء نظام مشغل وسائط بسيط. ستقوم بتعريف واجهة تضع عقداً لأنواع مختلفة من أجهزة الوسائط.
ستتلقى مدخلاً واحداً:
- سلسلة نصية تمثل إجراءً للوسائط (على سبيل المثال،
"play"، أو"pause"، أو"stop")
مهمتك هي:
- تعريف واجهة تسمى
MediaPlayerبثلاثة تواقيع للدوال (method signatures):Play()التي تعيد سلسلة نصية (string)Pause()التي تعيد سلسلة نصية (string)Stop()التي تعيد سلسلة نصية (string)
- بناءً على إجراء الإدخال، قم بطباعة توقيع الدالة المقابل من واجهة
MediaPlayerالخاصة بك بالتنسيق التالي:"MediaPlayer interface requires: [MethodName]() string"
تهدف جملة الطباعة إلى التعبير عن الواجهة التي قمت بتعريفها أعلاه — فأنت تصف توقيع الدالة الذي تتطلبه واجهة MediaPlayer للإجراء المحدد. فكر في الأمر كما لو أن برنامجك يقوم بفحص والإبلاغ عن عقد الواجهة الخاص به.
يجب أن تبدأ أسماء الدوال بحرف كبير (مُصدرة - exported) لأنها جزء من تعريف الواجهة. بالنسبة للمدخل "play"، اطبع "MediaPlayer interface requires: Play() string"، وللمدخل "pause" اطبع "MediaPlayer interface requires: Pause() string"، وللمدخل "stop" اطبع "MediaPlayer interface requires: Stop() string".
يركز هذا التحدي على المفهوم الأساسي لتعريف الواجهات بتواقيع الدوال، ووضع العقد الذي يجب على أي نوع يقوم بالتنفيذ الوفاء به.
ورقة مرجعية
يتم تعريف الواجهة (interface) باستخدام الكلمة المفتاحية interface متبوعة بتواقيع الدوال (method signatures) داخل أقواس متعرجة:
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}تحتوي الواجهات فقط على تواقيع الدوال (الاسم، المعاملات، وأنواع الإرجاع) ولكن بدون أي تنفيذ (implementation):
type Shaper interface {
Area() float64
}أي نوع يقوم بتنفيذ جميع الدوال الموجودة في الواجهة يستوفي تلقائياً عقد تلك الواجهة.
جرّب بنفسك
package main
import "fmt"
func main() {
// قراءة المدخلات
var action string
fmt.Scanln(&action)
// TODO: قم بتعريف واجهة MediaPlayer هنا
// TODO: اكتب الكود الخاص بك أدناه للتعامل مع الإجراء وطباعة المخرجات المطلوبة
// طباعة النتيجة
// تذكر الطباعة بالتنسيق التالي: "MediaPlayer interface requires: [MethodName]() string"
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات