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

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

جزء من قسم البرمجة كائنية التوجه في رحلة GO على Coddy. الدرس 25 من 107.

يعرّف interface في Go مجموعةً من توقيعات method من دون تنفيذها. وهو يصف ما يمكن لنوعٍ ما فعله، وليس كيفية فعله. وأي نوع ينفّذ جميع method الموجودة في interface يستوفي هذه interface تلقائيًا.

إليك كيفية تعريف interface:

type Speaker interface {
    Speak() string
}

تتطلب واجهة Speaker هذه أن يحتوي أي نوع ينفّذها على أسلوب Speak() يُرجع سلسلة نصية. والآن يمكن استخدام أي بنية تحتوي على هذا الأسلوب في أي موضع يُتوقَّع فيه وجود 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)  // بادي يقول ووف!
    MakeSound(cat)  // ويسكرز يقول مياو!
}

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

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لوصف المركبات يوضّح كيف تسمح الواجهات للأنواع المختلفة بمشاركة السلوك المشترك. ستنشئ واجهة يمكن لأنواع متعددة من المركبات تحقيقها، ثم تستخدمها لوصف أي مركبة بطريقة موحّدة.

ستنظّم التعليمات البرمجية عبر ملفين:

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

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

  • السطر 1: ماركة Car
  • السطر 2: طراز Car
  • السطر 3: نوع Bicycle
  • السطر 4: عدد التروس (عدد صحيح)

يجب أن تُرجع methods Describe() السلاسل بالتنسيقين التاليين:

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

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

Toyota Camry
Mountain bike with 21 gears

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

جرّب بنفسك

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اختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Go عبر الإنترنت