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

ترقية الـ Method

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

تمامًا كما يعمل تضمين البُنى على ترقية الحقول إلى البنية الخارجية، تعمل Go أيضًا على ترقية الأساليب من الأنواع المضمّنة. وهذا يعني أنه يمكنك استدعاء الأساليب المعرّفة على البنية المضمّنة مباشرةً على البنية الخارجية.

type Engine struct {
    Horsepower int
}

func (e Engine) Start() string {
    return "Engine started"
}

type Car struct {
    Model string
    Engine  // مضمن
}

بما أن Car يضمّن Engine، تتم ترقية الطريقة Start() تلقائيًا:

func main() {
    c := Car{
        Model:  "Sedan",
        Engine: Engine{Horsepower: 200},
    }
    
    fmt.Println(c.Start())         // تم تشغيل المحرك
    fmt.Println(c.Engine.Start())  // يعمل أيضاً
}

لهذا الترويج نتيجة مهمة بالنسبة إلى الواجهات. إذا كان النوع المضمَّن يحقق واجهة، فإن النوع الخارجي يحققها تلقائيًا أيضًا:

type Starter interface {
    Start() string
}

func Ignite(s Starter) {
    fmt.Println(s.Start())
}

func main() {
    c := Car{Model: "Sedan", Engine: Engine{Horsepower: 200}}
    Ignite(c)  // Car يلبي Starter من خلال Engine
}

لا يطبّق النوع Car الواجهة Starter بشكل صريح مطلقًا، ومع ذلك فهو يستوفي الواجهة لأن Engine المضمَّن فيه يملك الطريقة المطلوبة. هذه هي الطريقة التي تحقق بها Go إعادة استخدام السلوك من دون وراثة تقليدية.

challenge icon

التحدي

سهل

لنَبْنِ نظامَ مشغّل موسيقى يوضّح كيفية ترقية الأساليب من الأنواع المُضمَّنة إلى النوع الخارجي، وكيف يتيح ذلك استيفاء الواجهة من خلال التركيب.

ستنظّم شيفرتك عبر ملفَّين:

  • audio.go: أنشئ اللبنات الأساسية لمشغّل الموسيقى:
    • بنية AudioPlayer تحتوي على حقل Brand (من النوع string) وأسلوب Play() string يعيد [Brand] playing audio
    • واجهة Playable تتطلّب أسلوب Play() string
    • بنية Smartphone تحتوي على حقل Model وتضمّن AudioPlayer
    • بنية Tablet تحتوي على حقل Model وتضمّن AudioPlayer
  • main.go: أنشئ دالة تُسمّى StartPlayback تقبل أي قيمة من النوع Playable وتعيد نتيجة استدعاء Play(). اقرأ معلومات الأجهزة من الإدخال، وأنشئ كلاً من Smartphone وTablet، ووضّح أن كليهما يستوفيان الواجهة Playable من خلال AudioPlayer المُضمَّن فيهما، رغم أن أياً من النوعين لا ينفّذ Play() صراحةً بنفسه.

ستُقدَّم المدخلات التالية:

  • السطر 1: اسم طراز Smartphone
  • السطر 2: العلامة التجارية لنظام الصوت في Smartphone
  • السطر 3: اسم طراز Tablet
  • السطر 4: العلامة التجارية لنظام الصوت في Tablet

لكل جهاز، اطبع طرازه متبوعاً بنتيجة تمريره إلى StartPlayback.

على سبيل المثال، عند إعطاء iPhone 15 وApple Audio وiPad Pro وBeats، يجب أن يكون ناتجك:

iPhone 15
Apple Audio playing audio
iPad Pro
Beats playing audio

لاحظ كيف يمكن تمرير كلٍّ من Smartphone وTablet إلى StartPlayback لأن أسلوب Play() من AudioPlayer يُرقّى تلقائياً إلى كل نوع خارجي، مما يحقّق الواجهة Playable دون أي شيفرة إضافية.

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
)

// TODO: أنشئ دالة StartPlayback تقبل أي Playable
// وتعيد نتيجة استدعاء Play()

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	
	// اقرأ طراز الهاتف الذكي
	scanner.Scan()
	smartphoneModel := scanner.Text()
	
	// اقرأ ماركة صوت الهاتف الذكي
	scanner.Scan()
	smartphoneBrand := scanner.Text()
	
	// اقرأ طراز الجهاز اللوحي
	scanner.Scan()
	tabletModel := scanner.Text()
	
	// اقرأ ماركة صوت الجهاز اللوحي
	scanner.Scan()
	tabletBrand := scanner.Text()
	
	// TODO: أنشئ Smartphone مع الـ AudioPlayer المضمّن
	
	// TODO: أنشئ Tablet مع الـ AudioPlayer المضمّن
	
	// TODO: اطبع طراز الهاتف الذكي، ثم استدعِ StartPlayback مع الهاتف الذكي
	
	// TODO: اطبع طراز الجهاز اللوحي، ثم استدعِ StartPlayback مع الجهاز اللوحي
	
	_ = smartphoneModel
	_ = smartphoneBrand
	_ = tabletModel
	_ = tabletBrand
	fmt.Println("TODO: Complete the implementation")
}
quiz iconاختبر نفسك

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

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

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