دروس الوحدة (1/2)
واجهات
في حين أن الفئات المجردة يمكن أن تحتوي على كل من التعليمات البرمجية المطبقة جزئيًا وحقول المثيلات، فإن الواجهات في Java هي عقود سلوك خالص. تحدد الواجهة ما يجب أن يكون الفصل قادرًا على فعله، ولكن ليس كيف يفعل ذلك.
وهذا يسمح بالفصل الكامل بين تعريف العمليات وتنفيذها الفعلي.
تعريف الواجهة (interface)
نحن نستخدم الكلمة الأساسية interface. جميع الأساليب المعلنة في الواجهة تكون ضمنيًا public وabstract (لا حاجة لتحديدها):
interface Drivable {
void startEngine();
void stopEngine();
}تنفيذ واجهة (implements)
يطبق الفصل واجهة باستخدام الكلمة الأساسية implements ويلزم توفير التنفيذ (مع نص) لجميع الطرق المحددة:
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}مزايا الواجهات
- الوراثة المتعددة: في Java، يمكن للفصل توسيع فئة أصل واحدة فقط (وراثة واحدة)، ولكن يمكنه تنفيذ واجهات متعددة في نفس الوقت.
Java
class HybridCar implements Drivable, Chargeable { ... } - الفصل: يمكنك تحديد المتغيرات باستخدام نوع الواجهة. يمكن تعيين أي كائن يقوم بتنفيذ تلك الواجهة لمثل هذا المتغير.
Java
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
الثوابت في الواجهات
في الواجهات، من الممكن الإعلان عن الحقول. هذه الحقول ضمنيًا public static final (بمعنى ثوابت الفئة)، حتى لو لم تحدد هذه المعدلات. وبالتالي، يجب أن يتم تهيئتها فور الإعلان:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitly public static final
}الطرق الافتراضية (default)
بدءًا من Java 8، من الممكن تحديد الأساليب ذات التنفيذ الافتراضي داخل الواجهة باستخدام الكلمة الأساسية default. لا تجبر هذه التوابع الفئات المنفذة على تجاوزها، مما يوفر سلوكًا احتياطيًا:
interface Logger {
void log(String message);
// Default method with a body
default void logError(String message) {
log("ERROR: " + message);
}
}جربه بنفسك
قم بإنشاء واجهة Flyable باستخدام طريقة void fly(). ثم قم بتنفيذ فئة Bird التي تنفذ Flyable وتطبع Flying على الشاشة.
إظهار التلميح
في Flyable، اكتب `void fly();`. في فئة الطيور، قم بتنفيذ طريقة وضع علامة عليها باستخدام `@Override public void fly() { System.out.println('Flying'); }`.
الحل متاح بعد 3 من المحاولات
حدد واجهة قابلة للرسم باستخدام طريقة void draw(). ثم قم بتطبيق فئة Rectangle التي تنفذ Drawable وتطبع رسم Rectangle.
إظهار التلميح
حدد ``void draw();`` في الواجهة. في المستطيل، استخدم `@Override public void draw() { System.out.println('Drawing Rectangle'); }`.
الحل متاح بعد 3 من المحاولات
أكمل واجهة Swimmable عن طريق تحديد طريقة void swim() . بعد ذلك، أكمل فئة Duck بحيث تنفذ كلا من Flyable وSwimmable، وطباعة Flying في طريقة fly() وSwiming في طريقة swim().
إظهار التلميح
قم بتعريف `void swim();` داخل Swimmable. قم بتعريف فئة Duck التي تطبق Flyable وSwimmable ونفذ كلا الطريقتين لطباعة السلاسل المطلوبة.
الحل متاح بعد 3 من المحاولات