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

تنفيذ واجهات متعددة

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

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

لتنفيذ واجهات متعددة، قم بسردها بعد الكلمة المفتاحية implements، مفصولة بفواصل:

public interface Drawable {
    void draw();
}

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

public class Rectangle implements Drawable, Resizable {
    private int width, height;
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing rectangle " + width + "x" + height);
    }
    
    @Override
    public void resize(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

يجب أن تقوم الفئة (class) بتنفيذ جميع الدوال (methods) من كل واجهة (interface) تصرح عنها. يمكنك أيضاً الجمع بين الوراثة (inheritance) وواجهات متعددة:

public class Square extends Shape implements Drawable, Resizable {
    // يجب تنفيذ الدوال من كلا الواجهتين
    // يمكن أيضاً استخدام الأعضاء الموروثة من Shape
}

تتيح لك هذه المرونة تصميم فئات تؤدي أدواراً متعددة. يمكن لـ SmartPhone تنفيذ واجهات Callable و Messageable و Browsable، حيث تحدد كل منها إمكانيات مختلفة يدعمها الهاتف.

challenge icon

التحدي

سهل

لنقم ببناء نظام أجهزة ذكية حيث يمكن للأجهزة أن تمتلك قدرات متعددة. ستقوم بإنشاء SmartTV يمكن تشغيله/إيقاف تشغيله والتحكم في مستوى صوته—مما يوضح كيف يمكن لفئة واحدة تنفيذ واجهات متعددة للقيام بأدوار مختلفة.

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

  • Powerable.java: قم بتعريف واجهة (interface) للأجهزة التي يمكن تزويدها بالطاقة. يجب أن تعلن عن طريقتين (methods): powerOn() و powerOff()، وكلاهما يعيد void.
  • VolumeControl.java: قم بتعريف واجهة للأجهزة التي تحتوي على تحكم في مستوى الصوت. يجب أن تعلن عن طريقة setVolume(int level) التي تعيد void، وطريقة getVolume() التي تعيد int.
  • SmartTV.java: قم بإنشاء فئة (class) تنفذ واجهتي Powerable و VolumeControl. يجب أن يحتوي SmartTV الخاص بك على حقل brand (String)، وحقل isOn (boolean، مبدئيًا false)، وحقل volume (int، مبدئيًا 0). قم بتضمين منشئ (constructor) يأخذ اسم العلامة التجارية. قم بتنفيذ جميع الطرق المطلوبة:
    • powerOn() يجب أن يضبط isOn على true ويطبع: [brand] TV is now ON
    • powerOff() يجب أن يضبط isOn على false ويطبع: [brand] TV is now OFF
    • setVolume(int level) يجب أن يحدث مستوى الصوت ويطبع: [brand] TV volume set to [level]
    • getVolume() يجب أن يعيد مستوى الصوت الحالي
  • Main.java: اجمع كل شيء معًا لتوضيح تنفيذ الواجهات المتعددة. ستتلقى مدخلين: اسم العلامة التجارية (String) ومستوى الصوت (int). قم بإنشاء SmartTV بالعلامة التجارية المعطاة، ثم:
    • استدعِ powerOn()
    • استدعِ setVolume() بالمستوى المعطى
    • اطبع: Current volume: [volume] باستخدام getVolume()
    • استدعِ powerOff()

ستتلقى مدخلين: العلامة التجارية للتلفزيون (String) ومستوى الصوت (int).

يجب أن يظهر مخرجك أربعة أسطر توضح كيف يلبي SmartTV الخاص بك عقود الواجهتين—حيث يمكن تشغيله مثل أي جهاز Powerable والتحكم في مستوى صوته مثل أي جهاز VolumeControl!

ورقة مرجعية

يمكن للفئة تنفيذ واجهات متعددة عبر إدراجها بعد الكلمة المفتاحية implements، مفصولة بفاصلات:

public class Rectangle implements Drawable, Resizable {
    // يجب تنفيذ جميع الدوال من كلتا الواجهتين
}

يجب على الفئة تنفيذ جميع الدوال من كل واجهة تعلن عنها.

يمكنك أيضاً الجمع بين وراثة الفئات وتنفيذ واجهات متعددة:

public class Square extends Shape implements Drawable, Resizable {
    // ينفذ الدوال من كلتا الواجهتين
    // يمكنه استخدام الأعضاء الموروثة من Shape
}

يتيح ذلك للفئة القيام بأدوار متعددة وامتلاك قدرات مختلفة.

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة المدخلات
        String brand = scanner.nextLine();
        int volumeLevel = scanner.nextInt();
        
        // TODO: قم بإنشاء SmartTV بالعلامة التجارية المعطاة
        
        // TODO: قم باستدعاء powerOn()
        
        // TODO: قم باستدعاء setVolume() بالمستوى المعطى
        
        // TODO: اطبع: Current volume: [volume] باستخدام getVolume()
        
        // TODO: قم باستدعاء powerOff()
        
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming