تعريف الواجهة
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 13 من 68.
والآن بعد أن فهمتَ مفهوم الواجهات، لنتعلم كيفية تعريف واجهة فعليًا في Go. تُعرَّف الواجهة باستخدام الكلمة المفتاحية interface متبوعة بمجموعة من تواقيع الأساليب المحصورة بين أقواس معقوفة.
إليك الصياغة الأساسية لتعريف واجهة:
type InterfaceName interface {
MethodName() ReturnType
AnotherMethod(parameter Type) ReturnType
}لاحظ أن الواجهة تحتوي فقط على تواقيع الأساليب - اسم الأسلوب والمعاملات وأنواع الإرجاع - دون أي تنفيذ. لا تحدد الواجهة كيفية عمل هذه الأساليب، بل تحدد فقط الأساليب التي يجب أن تكون موجودة.
على سبيل المثال، إليك كيفية تعريف واجهة بسيطة Shaper تشترط أن يتضمن أي نوع يطبّقها أسلوبًا Area:
type Shaper interface {
Area() float64
}تُرسي هذه الواجهة عقدًا: يجب أن يكون لأي نوع يريد أن يُعدّ Shaper طريقة Area لا تأخذ أي معلمات وتُرجع float64. لا تهتم الواجهة بنوع البيانات أو بكيفية حسابه للمساحة، بل تهتم فقط بوجود الطريقة بالتوقيع الصحيح.
التحدي
سهلفي هذا التحدي، ستتدرّب على تعريف الواجهات في Go من خلال إنشاء نظام بسيط لمشغّل وسائط. ستعرّف واجهة تحدد عقدًا لأنواع مختلفة من أجهزة الوسائط.
ستتلقى مُدخلًا واحدًا:
- سلسلة نصية تمثل إجراءً متعلقًا بالوسائط (مثل
"play"أو"pause"أو"stop")
مهمتك هي:
- تعريف واجهة باسم
MediaPlayerتحتوي على تواقيع ثلاث دوال:Play()تُرجع سلسلة نصيةPause()تُرجع سلسلة نصيةStop()تُرجع سلسلة نصية
- بناءً على الإجراء المُدخل، اطبع توقيع الدالة المقابل من واجهة
MediaPlayerبالتنسيق التالي:"MediaPlayer interface requires: [MethodName]() string"
لا يستخدم هذا البرنامج MediaPlayer بعد، ولا بأس بذلك: إذ تترجم Go الواجهة حتى عندما لا يطبّقها أي نوع. تعرض عبارات الطباعة ببساطة توقيع الدالة الذي تتطلبه واجهتك للإجراء المُعطى. في الدرس التالي، ستنشئ نوعًا يطبّق MediaPlayer وتستدعي دواله.
يجب أن تبدأ أسماء الدوال بحرف كبير (لتكون مُصدَّرة)، لأنها جزء من تعريف الواجهة. عند الإدخال "play"، اطبع "MediaPlayer interface requires: Play() string"، وعند الإدخال "pause" اطبع "MediaPlayer interface requires: Pause() string"، وعند الإدخال "stop" اطبع "MediaPlayer interface requires: Stop() string".
يركّز هذا التحدي على المفهوم الأساسي لتعريف الواجهات بتواقيع الدوال، وإنشاء العقد الذي يجب على أي نوع يطبّق الواجهة الوفاء به.
جرّب بنفسك
package main
import "fmt"
func main() {
// اقرأ المدخلات
var action string
fmt.Scanln(&action)
// TODO: عرّف واجهة MediaPlayer هنا
// TODO: اكتب الشيفرة أدناه لمعالجة الإجراء وطباعة المخرجات المطلوبة
// اطبع النتيجة
// تذكّر أن تطبع بالتنسيق: "MediaPlayer interface requires: [MethodName]() string"
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
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)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت