تطبيق الواجهة
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 14 من 68.
الآن بعد أن عرفت كيفية تعريف الواجهة (interface)، دعنا نتعلم كيف تقوم أنواع Go بتنفيذها فعلياً. أهم شيء يجب فهمه هو أن Go تستخدم التنفيذ الضمني (implicit implementation) - لا توجد كلمة رئيسية أو إعلان خاص مطلوب.
إذا كان النوع يحتوي على جميع الأساليب (methods) التي تتطلبها الواجهة (interface)، فإنه يستوفي تلك الواجهة تلقائيًا. لا تحتاج إلى التصريح صراحةً بأن نوعك ينفذ الواجهة - لغة Go تكتشف ذلك نيابة عنك.
إليك كيف يعمل ذلك مع واجهة Shaper من الدرس السابق:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}بما أن النوع Circle لديه دالة Area() تعيد القيمة float64، فإنه يحقق تلقائياً واجهة Shaper. لا توجد حاجة للتصريح عن هذه العلاقة بشكل صريح - حيث تتعرف لغة Go عليها بناءً على تطابق توقيع الدالة (method signature).
هذا النهج الضمني يجعل واجهات Go مرنة للغاية. يمكن لأي نوع موجود أن يستوفي واجهة جديدة طالما أنه يمتلك الأساليب (methods) المطلوبة، حتى لو تم إنشاء الواجهة بعد كتابة النوع.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
التحدي
سهلفي هذا التحدي، ستتدرب على تنفيذ واجهة (interface) من خلال إنشاء نظام مركبات بسيط. ستقوم بإنشاء هيكل Car يقوم تلقائيًا بتنفيذ واجهة Vehicle من خلال التنفيذ الضمني في لغة Go.
ستتلقى مدخلين:
- سلسلة نصية تمثل العلامة التجارية للسيارة (على سبيل المثال،
"Toyota") - سلسلة نصية تمثل سرعة السيارة بالكيلومتر في الساعة (على سبيل المثال،
"120")
مهمتك هي:
- تعريف واجهة
Vehicleبتوقيع طريقة واحدة:GetInfo()تعيد سلسلة نصية - تعريف هيكل
Carبحقلين:Brand(string) وSpeed(int) - تنفيذ طريقة
GetInfo()لهيكلCarبحيث تعيد سلسلة نصية بالتنسيق التالي:"Brand: [brand], Speed: [speed] km/h" - تحليل المدخلات لإنشاء مثيل من
Car - استدعاء طريقة
GetInfo()وطباعة النتيجة
تذكر أنه في لغة Go، سيقوم هيكل Car بتنفيذ واجهة Vehicle تلقائيًا لأنه يحتوي على طريقة GetInfo() المطلوبة بالتوقيع الصحيح. لا داعي للتصريح صراحةً بأن Car ينفذ Vehicle - حيث تتعرف Go على هذه العلاقة ضمنيًا.
ورقة مرجعية
تستخدم لغة Go **التنفيذ الضمني (implicit implementation)** للواجهات (interfaces) - لا حاجة لأي كلمة مفتاحية أو تصريح خاص.
إذا كان النوع يحتوي على جميع الدوال (methods) التي تتطلبها الواجهة، فإنه يحقق تلك الواجهة تلقائيًا:
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}بما أن Circle تمتلك دالة Area() تُرجع قيمة من نوع float64، فإنها تنفذ واجهة Shaper تلقائيًا دون الحاجة لتصريح صريح.
هذا النهج الضمني يجعل واجهات Go مرنة - حيث يمكن لأي نوع موجود أن يحقق واجهة جديدة طالما أنه يمتلك الدوال المطلوبة، حتى لو تم إنشاء الواجهة بعد إنشاء النوع.
جرّب بنفسك
package main
import (
"fmt"
"strconv"
)
// TODO: 1. قم بتعريف واجهة (interface) باسم Vehicle مع طريقة GetInfo() string
// TODO: 2. قم بتعريف هيكل (struct) باسم Car مع حقول Brand (string) و Speed (int)
// TODO: 3. قم بتنفيذ طريقة GetInfo() للهيكل Car
func main() {
// قراءة المدخلات
var brand string
var speedStr string
fmt.Scanln(&brand)
fmt.Scanln(&speedStr)
// تحويل نص السرعة إلى عدد صحيح
speed, _ := strconv.Atoi(speedStr)
// TODO: 4. قم بإنشاء مثيل (instance) من Car باستخدام brand و speed، ثم استدعِ GetInfo()
result := "" // استبدل هذا السطر بتنفيذك
_ = brand
_ = speed
// طباعة النتيجة
fmt.Println(result)
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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)ملخص - الأشكال والسلوكيات