الانتقال إلى المحتوى الرئيسي
الوحدة 4 · الدرس 1 من 27/14 في الدورة~15 min
دروس الوحدة (1/2)

واجهات

في حين أن الفئات المجردة يمكن أن تحتوي على كل من التعليمات البرمجية المطبقة جزئيًا وحقول المثيلات، فإن الواجهات في Java هي عقود سلوك خالص. تحدد الواجهة ما يجب أن يكون الفصل قادرًا على فعله، ولكن ليس كيف يفعل ذلك.

وهذا يسمح بالفصل الكامل بين تعريف العمليات وتنفيذها الفعلي.

تعريف الواجهة (interface)

نحن نستخدم الكلمة الأساسية interface. جميع الأساليب المعلنة في الواجهة تكون ضمنيًا public وabstract (لا حاجة لتحديدها):

Java
interface Drivable {
    void startEngine();
    void stopEngine();
}

تنفيذ واجهة (implements)

يطبق الفصل واجهة باستخدام الكلمة الأساسية implements ويلزم توفير التنفيذ (مع نص) لجميع الطرق المحددة:

Java
class Motorcycle implements Drivable {
    @Override
    public void startEngine() {
        System.out.println("Rombo del motore acceso!");
    }

    @Override
    public void stopEngine() {
        System.out.println("Motore spento.");
    }
}

مزايا الواجهات

  1. الوراثة المتعددة: في Java، يمكن للفصل توسيع فئة أصل واحدة فقط (وراثة واحدة)، ولكن يمكنه تنفيذ واجهات متعددة في نفس الوقت.
    Java
    class HybridCar implements Drivable, Chargeable { ... }
  2. الفصل: يمكنك تحديد المتغيرات باستخدام نوع الواجهة. يمكن تعيين أي كائن يقوم بتنفيذ تلك الواجهة لمثل هذا المتغير.
    Java
    Drivable vehicle = new Motorcycle();
    vehicle.startEngine();

الثوابت في الواجهات

في الواجهات، من الممكن الإعلان عن الحقول. هذه الحقول ضمنيًا public static final (بمعنى ثوابت الفئة)، حتى لو لم تحدد هذه المعدلات. وبالتالي، يجب أن يتم تهيئتها فور الإعلان:

Java
interface PhysicsConstants {
    double GRAVITY = 9.81; // Implicitly public static final
}

الطرق الافتراضية (default)

بدءًا من Java 8، من الممكن تحديد الأساليب ذات التنفيذ الافتراضي داخل الواجهة باستخدام الكلمة الأساسية default. لا تجبر هذه التوابع الفئات المنفذة على تجاوزها، مما يوفر سلوكًا احتياطيًا:

Java
interface Logger {
    void log(String message);

    // Default method with a body
    default void logError(String message) {
        log("ERROR: " + message);
    }
}

جربه بنفسك

تمرين#java.m4.l1.e1
المحاولات: 0جارٍ التحميل…

قم بإنشاء واجهة Flyable باستخدام طريقة void fly(). ثم قم بتنفيذ فئة Bird التي تنفذ Flyable وتطبع Flying على الشاشة.

جارٍ تحميل المحرر…
إظهار التلميح

في Flyable، اكتب `void fly();`. في فئة الطيور، قم بتنفيذ طريقة وضع علامة عليها باستخدام `@Override public void fly() { System.out.println('Flying'); }`.

الحل متاح بعد 3 من المحاولات

تمرين#java.m4.l1.e2
المحاولات: 0جارٍ التحميل…

حدد واجهة قابلة للرسم باستخدام طريقة void draw(). ثم قم بتطبيق فئة Rectangle التي تنفذ Drawable وتطبع رسم Rectangle.

جارٍ تحميل المحرر…
إظهار التلميح

حدد ``void draw();`` في الواجهة. في المستطيل، استخدم `@Override public void draw() { System.out.println('Drawing Rectangle'); }`.

الحل متاح بعد 3 من المحاولات

تمرين#java.m4.l1.e3
المحاولات: 0جارٍ التحميل…

أكمل واجهة Swimmable عن طريق تحديد طريقة void swim() . بعد ذلك، أكمل فئة Duck بحيث تنفذ كلا من Flyable وSwimmable، وطباعة Flying في طريقة fly() وSwiming في طريقة swim().

جارٍ تحميل المحرر…
إظهار التلميح

قم بتعريف `void swim();` داخل Swimmable. قم بتعريف فئة Duck التي تطبق Flyable وSwimmable ونفذ كلا الطريقتين لطباعة السلاسل المطلوبة.

الحل متاح بعد 3 من المحاولات