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

تطبيق الواجهة

جزء من قسم 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) المطلوبة، حتى لو تم إنشاء الواجهة بعد كتابة النوع.

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

challenge icon

التحدي

سهل

في هذا التحدي، ستتدرب على تنفيذ واجهة (interface) من خلال إنشاء نظام مركبات بسيط. ستقوم بإنشاء هيكل Car يقوم تلقائيًا بتنفيذ واجهة Vehicle من خلال التنفيذ الضمني في لغة Go.

ستتلقى مدخلين:

  • سلسلة نصية تمثل العلامة التجارية للسيارة (على سبيل المثال، "Toyota")
  • سلسلة نصية تمثل سرعة السيارة بالكيلومتر في الساعة (على سبيل المثال، "120")

مهمتك هي:

  1. تعريف واجهة Vehicle بتوقيع طريقة واحدة: GetInfo() تعيد سلسلة نصية
  2. تعريف هيكل Car بحقلين: Brand (string) و Speed (int)
  3. تنفيذ طريقة GetInfo() لهيكل Car بحيث تعيد سلسلة نصية بالتنسيق التالي: "Brand: [brand], Speed: [speed] km/h"
  4. تحليل المدخلات لإنشاء مثيل من Car
  5. استدعاء طريقة 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)
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow