مقدمة في الواجهات (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.
التحدي
سهللنقم ببناء نظام تحكم في الأجهزة من خلال تعريف واجهات (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, turnOffAdjustable methods: setLevelMax 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: " متبوعاً بمستوى الإدخال
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المكرر