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

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

جزء من قسم Object Oriented Programming في رحلة Java على Coddy — الدرس 34 من 87.

لقد رأيت كيف تحدد الفئات المجردة (abstract classes) العقود التي يجب أن تتبعها الفئات الفرعية (subclasses). ولكن ماذا لو كنت تريد أن تتبع فئة واحدة عقوداً متعددة؟ لا تسمح لغة Java لفئة ما بتوسيع (extend) فئات متعددة، لكنها تحل هذه المشكلة باستخدام الواجهات (interfaces).

تُعد **الواجهة (interface)** بمثابة عقد يحدد ما يمكن للفئة (class) القيام به، دون تحديد كيفية القيام بذلك. وعلى عكس الفئات المجردة (abstract classes)، تحتوي الواجهات فقط على تواقيع الدوال (بشكل افتراضي) دون أي تنفيذ:

public interface Drawable {
    void draw();
}

public interface Resizable {
    void resize(int width, int height);
}

فكر في الواجهة (interface) كأنها وعد. فعندما تقوم فئة (class) بتنفيذ واجهة ما، فإنها تعد بتقديم تنفيذات (implementations) لجميع الأساليب (methods) المعلن عنها في تلك الواجهة. تحدد الواجهة القدرة، بينما توفر الفئة السلوك.

يتم التصريح عن الواجهات (Interfaces) باستخدام الكلمة المفتاحية interface بدلاً من class. جميع الدوال (methods) في الواجهة هي public و abstract بشكل ضمني، لذا لا تحتاج إلى كتابة هذه الكلمات المفتاحية:

public interface Playable {
    void play();    // public abstract بشكل ضمني
    void pause();
    void stop();
}

يمكن للواجهات أيضاً التصريح عن الثوابت، والتي تكون ضمنياً public static final:

public interface GameConstants {
    int MAX_PLAYERS = 4;  // بشكل ضمني public static final
}

في الدرس القادم، ستتعلم كيف تقوم الأصناف (classes) بتنفيذ الواجهات (interfaces) باستخدام الكلمة المفتاحية implements.

challenge icon

التحدي

سهل

لنقم ببناء نظام تحكم في الأجهزة من خلال تعريف واجهات (interfaces) تصف ما يمكن للأجهزة المختلفة القيام به. يركز هذا التحدي على إنشاء الواجهات - العقود التي تحدد القدرات دون تحديد كيفية عملها.

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

  • Switchable.java: قم بإنشاء واجهة (interface) تحدد ما يعنيه أن يكون الجهاز قابلاً للتبديل (switchable). يجب أن يكون أي جهاز قابل للتبديل قادرًا على التشغيل والإيقاف. قم بالتصريح عن طريقتين (methods): turnOn() و turnOff(). تذكر أن طرق الواجهة هي public و abstract بشكل ضمني، لذا فأنت تحتاج فقط إلى تواقيع الطرق (method signatures).
  • Adjustable.java: قم بإنشاء واجهة أخرى تحدد ما يعنيه أن يكون الجهاز قابلاً للضبط (adjustable). يجب أن يكون الجهاز القابل للضبط قادرًا على تحديد مستواه. قم بالتصريح عن طريقة setLevel(int level). قم أيضًا بتضمين ثابت MAX_LEVEL بقيمة 100—تذكر أن الثوابت في الواجهات هي public static final بشكل ضمني.
  • Main.java: أثبت أن واجهاتك قد تم تعريفها بشكل صحيح من خلال طباعة معلومات عنها. ستتلقى مدخلاً واحدًا: قيمة المستوى (int). اطبع الأسطر الثلاثة التالية:
    • Switchable methods: turnOn, turnOff
    • Adjustable methods: setLevel
    • Max level constant: [MAX_LEVEL value] (قم بالوصول إلى الثابت من واجهة Adjustable)
    ثم اطبع: Setting level to: [input level]

ستتلقى مدخلاً واحدًا: قيمة المستوى (int).

يركز هذا التحدي بشكل بحت على تعريف الواجهات (interfaces)—المخططات التي تصف القدرات. في الدرس القادم، ستتعلم كيف تقوم الفئات (classes) بتنفيذ هذه الواجهات فعليًا لتوفير السلوك الحقيقي!

ورقة مرجعية

تُعد الواجهة (interface) بمثابة عقد يحدد ما يمكن للفئة (class) القيام به، دون تحديد كيفية القيام بذلك. تحتوي الواجهات فقط على تواقيع الدوال (method signatures) بدون أي تنفيذ.

يتم التصريح عن الواجهات باستخدام الكلمة المفتاحية interface:

public interface Drawable {
    void draw();
}

تكون جميع الدوال في الواجهة public و abstract بشكل ضمني:

public interface Playable {
    void play();    // public abstract بشكل ضمني
    void pause();
    void stop();
}

يمكن للواجهات التصريح عن الثوابت، والتي تكون public static final بشكل ضمني:

public interface GameConstants {
    int MAX_PLAYERS = 4;  // public static final بشكل ضمني
}

يمكن للفئة (class) تنفيذ واجهات متعددة، على عكس وراثة فئات متعددة.

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int level = scanner.nextInt();
        
        // TODO: اطبع معلومات حول الواجهات
        // اطبع: "Switchable methods: turnOn, turnOff"
        // اطبع: "Adjustable methods: setLevel"
        // اطبع: "Max level constant: " متبوعاً بـ Adjustable.MAX_LEVEL
        // اطبع: "Setting level to: " متبوعاً بمستوى الإدخال
        
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming