Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مقدمة في الواجهات

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 25 من 107.

تُحدد الـ interface في Go مجموعة من تواقيع الـ methods دون تنفيذها. فهي تصف ما يمكن للـ type القيام به، وليس كيفية القيام بذلك. وأي type يقوم بتنفيذ جميع الـ methods في الـ interface فإنه يستوفي تلك الـ interface تلقائيًا.

إليك كيفية تعريف واجهة (interface):

type Speaker interface {
    Speak() string
}

تتطلب واجهة Speaker هذه من أي نوع يقوم بتنفيذها أن يحتوي على طريقة Speak() تعيد سلسلة نصية. الآن، يمكن استخدام أي struct يحتوي على هذه الطريقة في أي مكان يُتوقع فيه وجود Speaker.

type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return d.Name + " says woof!"
}

type Cat struct {
    Name string
}

func (c Cat) Speak() string {
    return c.Name + " says meow!"
}

كل من Dog و Cat يحققان واجهة Speaker لأن كلاً منهما يمتلك دالة Speak() بالتوقيع الصحيح. يمكنك الآن كتابة دوال تقبل أي Speaker:

func MakeSound(s Speaker) {
    fmt.Println(s.Speak())
}

func main() {
    dog := Dog{Name: "Buddy"}
    cat := Cat{Name: "Whiskers"}
    
    MakeSound(dog)  // Buddy يقول woof!
    MakeSound(cat)  // Whiskers يقول meow!
}

تمكنك الواجهات من كتابة كود مرن وقابل لإعادة الاستخدام يعمل مع أي نوع يلبي متطلبات الواجهة، بغض النظر عن التنفيذ الأساسي.

challenge icon

التحدي

سهل

لنقم ببناء نظام لوصف المركبات يوضح كيف تسمح الواجهات (interfaces) للأنواع المختلفة بمشاركة سلوك مشترك. ستقوم بإنشاء واجهة يمكن لأنواع متعددة من المركبات تحقيقها، ثم استخدامها لوصف أي مركبة بشكل موحد.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • vehicles.go: قم بتعريف واجهة Describer باستخدام طريقة واحدة Describe() string. ثم قم بإنشاء هيكلين (structs) يحققان هذه الواجهة:
    • Car مع حقول Brand و Model (كلاهما strings)
    • Bicycle مع حقول Type (string) و Gears (int)
    يجب أن يحتوي كل هيكل على طريقة Describe() تعيد سلسلة نصية وصفية عن المركبة.
  • main.go: قم بإنشاء دالة تسمى PrintDescription تقبل أي Describer وتطبع نتيجة استدعاء طريقة Describe() الخاصة به. اقرأ معلومات المركبة من المدخلات، وأنشئ كلاً من Car و Bicycle، واستخدم دالتك لطباعة الأوصاف لكل منهما.

سيتم توفير المدخلات التالية:

  • السطر 1: ماركة السيارة (Car brand)
  • السطر 2: طراز السيارة (Car model)
  • السطر 3: نوع الدراجة (Bicycle type)
  • السطر 4: عدد التروس (Number of gears - عدد صحيح)

يجب أن تعيد طرق Describe() الخاصة بك سلاسل نصية بهذه التنسيقات:

  • Car: [Brand] [Model]
  • Bicycle: [Type] bike with [Gears] gears

على سبيل المثال، إذا كانت المدخلات Toyota، Camry، Mountain، و 21، يجب أن يكون مخرجك:

Toyota Camry
Mountain bike with 21 gears

الفكرة الأساسية هي أن دالة PrintDescription تعمل مع أي نوع يحتوي على طريقة Describe()—فهي لا تحتاج إلى معرفة ما إذا كانت تتعامل مع Car أو Bicycle أو أي نوع مركبة آخر قد تضيفه لاحقاً.

ورقة مرجعية

تُعرّف الواجهة (interface) في لغة Go مجموعة من تواقيع الدوال (method signatures) دون تنفيذها. أي نوع يقوم بتنفيذ جميع هذه الدوال يستوفي تلك الواجهة تلقائياً.

تعريف الواجهة:

type Speaker interface {
    Speak() string
}

الأنواع التي تقوم بتنفيذ الدوال المطلوبة تستوفي الواجهة:

type Dog struct {
    Name string
}

func (d Dog) Speak() string {
    return d.Name + " says woof!"
}

type Cat struct {
    Name string
}

func (c Cat) Speak() string {
    return c.Name + " says meow!"
}

يمكن للدوال قبول أي نوع يستوفي الواجهة:

func MakeSound(s Speaker) {
    fmt.Println(s.Speak())
}

func main() {
    dog := Dog{Name: "Buddy"}
    cat := Cat{Name: "Whiskers"}
    
    MakeSound(dog)  // Buddy says woof!
    MakeSound(cat)  // Whiskers says meow!
}

جرّب بنفسك

package main

import (
	"fmt"
)

// TODO: قم بإنشاء دالة PrintDescription تقبل أي Describer
// وتطبع نتيجة استدعاء طريقة Describe() الخاصة به

func main() {
	// قراءة المدخلات
	var carBrand string
	var carModel string
	var bicycleType string
	var gears int

	fmt.Scanln(&carBrand)
	fmt.Scanln(&carModel)
	fmt.Scanln(&bicycleType)
	fmt.Scanln(&gears)

	// TODO: قم بإنشاء Car (سيارة) باستخدام العلامة التجارية والطراز من المدخلات

	// TODO: قم بإنشاء Bicycle (دراجة هوائية) باستخدام النوع والتروس من المدخلات

	// TODO: استخدم PrintDescription لطباعة وصف السيارة

	// TODO: استخدم PrintDescription لطباعة وصف الدراجة الهوائية
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming