تنفيذ واجهات متعددة
جزء من قسم البرمجة كائنية التوجه في رحلة 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 أن implement all methods من كل interface تعلنها. يمكنك أيضًا الجمع بين الوراثة وinterfaces متعددة:
public class Square extends Shape implements Drawable, Resizable {
// يجب تنفيذ الدوال من كلا الواجهتين
// يمكن أيضاً استخدام الأعضاء الموروثة من Shape
}تتيح لك هذه المرونة تصميم فئات تؤدي أدوارًا متعددة. يمكن لـ SmartPhone أن يطبّق واجهات Callable وMessageable وBrowsable، حيث تحدد كل واجهة قدرات مختلفة يدعمها الهاتف.
التحدي
سهللنبنِ نظامًا لأجهزة ذكية يمكن أن تتمتع فيه الأجهزة بقدرات متعددة. ستنشئ SmartTV يمكن تشغيله وإيقاف تشغيله والتحكم في مستوى صوته: مما يوضح كيف يمكن لفئة واحدة تنفيذ واجهات Powerable وVolumeControl متعددة للوفاء بأدوار مختلفة.
ستنظّم التعليمات البرمجية عبر أربعة ملفات:
Powerable.java: عرّف واجهة للأجهزة التي يمكن تشغيلها. يجب أن تعلن عن طريقتين:powerOn()وpowerOff()، وكلتاهما تعيدان void.VolumeControl.java: عرّف واجهة للأجهزة التي تتضمن تحكمًا في مستوى الصوت. يجب أن تعلن عن طريقةsetVolume(int level)التي تعيد void، وطريقةgetVolume()التي تعيد قيمة int.SmartTV.java: أنشئ فئة تنفذ واجهتيPowerableوVolumeControl. يجب أن تحتوي SmartTV على حقلbrand(String)، وحقلisOn(boolean، قيمته initially هي false)، وحقلvolume(int، قيمته initially هي 0). أدرج constructor يستقبل اسم brand. نفّذ جميع methods المطلوبة:- يجب أن تضبط
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()مستوى الصوت current
- يجب أن تضبط
Main.java: اجمع كل شيء معًا لإظهار تنفيذ واجهات متعددة. ستتلقى مدخلين: اسم brand (String) ومستوى الصوت (int). أنشئ SmartTV باستخدام brand المعطى، ثم:- استدعِ
powerOn() - استدعِ
setVolume()باستخدام المستوى المعطى - اطبع:
Current volume: [volume]باستخدامgetVolume() - استدعِ
powerOff()
- استدعِ
ستتلقى مدخلين: brand التلفاز (String) ومستوى الصوت (int).
يجب أن يعرض الناتج أربعة أسطر توضّح كيف تفي SmartTV بعقدي الواجهتين. يمكن تشغيلها مثل أي جهاز Powerable والتحكم في مستوى صوتها مثل أي جهاز VolumeControl!
جرّب بنفسك
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: Print: Current volume: [volume] using getVolume()
// TODO: استدعاء powerOff()
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةمقدمة في الـ OOPالفئات (Classes) مقابل الكائنات (Objects)الكلمة المفتاحية thisالدوال (Methods)الحقول (Attributes)دالة البناء (Constructor)تعدد أشكال دالة البناء (Constructor Overloading)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسية (extends)الكلمة المفتاحية superإعادة تعريف الدوال (@Override)تسلسل المنشئات (Constructor Chaining)كلاس Objectالوراثة الأحادية ومتعددة المستوياتلماذا لا توجد وراثة متعددة للكلاساتمراجعة - هيكلية الموظفين7الدوال الخاصة وفئة Object
دالة toString()equals() و hashCode()دالة clone()compareTo() و Comparableواجهة Comparatorمراجعة - الترتيب المخصص2محددات الوصول والتغليف
نظرة عامة على مستويات الوصولدوال Getter و Setterإخفاء البياناتالكلمة المفتاحية finalمراجعة - مدير الحساب البنكي5تعدد الأشكال (Polymorphism)
أساسيات الـ Method Overloadingالـ Method Overriding (في وقت التشغيل)الـ Upcasting والـ Downcastingمعامل الـ instanceofالفئات والدوال المجردة (Abstract)مراجعة - حاسبة الأشكال8مفاهيم OOP المتقدمة
الـ Composition مقابل الـ Inheritanceالـ Aggregation مقابل الـ Compositionالفئات الداخلية والمتداخلة والمجهولة (Inner, Nested & Anonymous)الـ Enums ودوالهاالـ Records (Java 16+)الـ Sealed Classes (Java 17+)11أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factoryنمط Builderنمط Observerنمط Strategy3خصائص الفئة والعضو الساكن
المتغيرات الخاصة بالكائن مقابل المتغيرات الساكنةالدوال الساكنةالكتل البرمجية الساكنةالثوابت (static final)ملخص - العداد والأدوات المساعدة6الواجهات (Interfaces) والأصناف المجردة (Abstract Classes)
مقدمة في الواجهات (Interfaces)تنفيذ الواجهات (Interfaces)تنفيذ واجهات متعددةالـ Default و Static في الواجهاتالأصناف المجردة مقابل الواجهاتالواجهات الوظيفية (Functional Interfaces)مراجعة - نظام الدفع9الأنواع العامة (Generics)
مقدمة في الأنواع العامةالأصناف العامة (Generic Classes)الدوال العامة (Generic Methods)معاملات الأنواع المقيدةالرموز البديلة (?, extends, super)مراجعة - الحاويات العامة12أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكررتدرّب بنفسك: مترجم Java عبر الإنترنت