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

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

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 13 من 68.

الآن بعد أن فهمت ما هي الواجهات (interfaces) من الناحية المفاهيمية، دعنا نتعلم كيفية تعريف واحدة فعلياً في لغة Go. يتم تعريف الواجهة باستخدام الكلمة المفتاحية interface متبوعة بمجموعة من تواقيع الدوال (method signatures) المحاطة بأقواس متعرجة.

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

type InterfaceName interface {
    MethodName() ReturnType
    AnotherMethod(parameter Type) ReturnType
}

لاحظ أن الواجهة (interface) تحتوي فقط على تواقيع الدوال (method signatures) - اسم الدالة، والمعاملات، وأنواع الإرجاع - ولكن بدون تنفيذ (implementation). لا تحدد الواجهة كيفية عمل هذه الدوال، بل تحدد فقط الدوال التي يجب أن تكون موجودة.

على سبيل المثال، إليك كيفية تعريف واجهة Shaper بسيطة تتطلب من أي نوع يقوم بتنفيذها أن يحتوي على طريقة Area:

type Shaper interface {
    Area() float64
}

تحدد هذه الواجهة عقداً: أي نوع يريد أن يُعتبر Shaper يجب أن يمتلك دالة Area لا تأخذ أي معاملات وتُرجع float64. لا تهتم الواجهة بنوع البيانات أو كيفية حساب المساحة - كل ما يهمها هو وجود الدالة بالتوقيع (signature) الصحيح.

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

quiz iconاختبر نفسك

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

challenge icon

التحدي

سهل

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

ستتلقى مدخلاً واحداً:

  • سلسلة نصية تمثل إجراءً للوسائط (على سبيل المثال، "play"، أو "pause"، أو "stop")

مهمتك هي:

  1. تعريف واجهة تسمى MediaPlayer بثلاثة تواقيع للدوال (method signatures):
    • Play() التي تعيد سلسلة نصية (string)
    • Pause() التي تعيد سلسلة نصية (string)
    • Stop() التي تعيد سلسلة نصية (string)
  2. بناءً على إجراء الإدخال، قم بطباعة توقيع الدالة المقابل من واجهة MediaPlayer الخاصة بك بالتنسيق التالي: "MediaPlayer interface requires: [MethodName]() string"

تهدف جملة الطباعة إلى التعبير عن الواجهة التي قمت بتعريفها أعلاه — فأنت تصف توقيع الدالة الذي تتطلبه واجهة MediaPlayer للإجراء المحدد. فكر في الأمر كما لو أن برنامجك يقوم بفحص والإبلاغ عن عقد الواجهة الخاص به.

يجب أن تبدأ أسماء الدوال بحرف كبير (مُصدرة - exported) لأنها جزء من تعريف الواجهة. بالنسبة للمدخل "play"، اطبع "MediaPlayer interface requires: Play() string"، وللمدخل "pause" اطبع "MediaPlayer interface requires: Pause() string"، وللمدخل "stop" اطبع "MediaPlayer interface requires: Stop() string".

يركز هذا التحدي على المفهوم الأساسي لتعريف الواجهات بتواقيع الدوال، ووضع العقد الذي يجب على أي نوع يقوم بالتنفيذ الوفاء به.

ورقة مرجعية

يتم تعريف الواجهة (interface) باستخدام الكلمة المفتاحية interface متبوعة بتواقيع الدوال (method signatures) داخل أقواس متعرجة:

type InterfaceName interface {
    MethodName() ReturnType
    AnotherMethod(parameter Type) ReturnType
}

تحتوي الواجهات فقط على تواقيع الدوال (الاسم، المعاملات، وأنواع الإرجاع) ولكن بدون أي تنفيذ (implementation):

type Shaper interface {
    Area() float64
}

أي نوع يقوم بتنفيذ جميع الدوال الموجودة في الواجهة يستوفي تلقائياً عقد تلك الواجهة.

جرّب بنفسك

package main

import "fmt"

func main() {
    // قراءة المدخلات
    var action string
    fmt.Scanln(&action)
    
    // TODO: قم بتعريف واجهة MediaPlayer هنا
    
    // TODO: اكتب الكود الخاص بك أدناه للتعامل مع الإجراء وطباعة المخرجات المطلوبة
    
    // طباعة النتيجة
    // تذكر الطباعة بالتنسيق التالي: "MediaPlayer interface requires: [MethodName]() string"
}
quiz iconاختبر نفسك

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

جميع دروس Logic & Flow