تنفيذ واجهات متعددة
جزء من قسم 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، حيث تحدد كل منها إمكانيات مختلفة يدعمها الهاتف.
التحدي
سهللنقم ببناء نظام أجهزة ذكية حيث يمكن للأجهزة أن تمتلك قدرات متعددة. ستقوم بإنشاء 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 ONpowerOff()يجب أن يضبطisOnعلى false ويطبع:[brand] TV is now OFFsetVolume(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()
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر