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

تنفيذ الواجهات (Interfaces)

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

لاستخدام واجهة (interface)، يجب على الفئة (class) تنفيذها باستخدام الكلمة المفتاحية implements. توفر الفئة بعد ذلك تطبيقات ملموسة لجميع الأساليب (methods) المعلن عنها في الواجهة:

public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

إذا قامت فئة (class) بتنفيذ واجهة (interface) ولكنها لم توفر تنفيذات لجميع دوالها (methods)، فسيقوم المترجم (compiler) بإظهار خطأ. يعد التعليق التوضيحي @Override اختيارياً ولكن يوصى به لأنه يساعد في اكتشاف الأخطاء.

تماماً كما هو الحال مع الفئات المجردة (abstract classes)، يمكنك استخدام الواجهة (interface) كنوع مرجعي (reference type). وهذا يتيح تعدد الأشكال (polymorphism) حيث يمكن التعامل مع الفئات المختلفة التي تنفذ نفس الواجهة بشكل موحد:

Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);

shape1.draw();  // رسم دائرة بنصف قطر 5.0
shape2.draw();  // رسم مستطيل 4.0 x 3.0

هذا أمر قوي لأن الكود الذي يعمل مع مراجع Drawable لا يحتاج إلى معرفة نوع الفئة (class) المحدد. كل ما يهمه هو أن الكائن يمكن رسمه.

في الدرس القادم، سترى كيف يمكن لفئة واحدة (class) تنفيذ واجهات (interfaces) متعددة في وقت واحد.

challenge icon

التحدي

سهل

لنقم ببناء نظام متحدثين يوضح كيفية تنفيذ الفئات (classes) للواجهات (interfaces). ستقوم بإنشاء واجهة تحدد ما يمكن لأي متحدث القيام به، ثم بناء نوعين مختلفين من المتحدثين ينفذ كل منهما هذا العقد بطريقته الخاصة.

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

  • Speaker.java: قم بتعريف واجهة تسمى Speaker تعلن عما يجب أن يكون أي متحدث قادرًا على فعله. يجب أن يكون لكل متحدث طريقة speak() تعيد String—هذا هو العقد الذي يجب على جميع الفئات المنفذة الوفاء به.
  • Human.java: قم بإنشاء فئة تنفذ واجهة Speaker. يمتلك الإنسان حقل name (String). قم بتضمين منشئ (constructor) لتهيئة الاسم، وقم بتنفيذ طريقة speak() لتعيد: [name] says: Hello everyone!
  • Robot.java: قم بإنشاء فئة أخرى تنفذ واجهة Speaker. يمتلك الروبوت حقل model (String). قم بتضمين منشئ لتهيئة النموذج، وقم بتنفيذ طريقة speak() لتعيد: Robot [model] says: Beep boop!
  • Main.java: اجمع كل شيء معًا باستخدام تعدد الأشكال القائم على الواجهة (interface-based polymorphism). ستتلقى مدخلين: اسم إنسان وطراز روبوت. قم بإنشاء Human و Robot، ثم قم بتخزينهما في مصفوفة من مراجع Speaker. قم بالمرور عبر المصفوفة واطبع نتيجة استدعاء speak() لكل متحدث.

ستتلقى مدخلين: اسم الإنسان (String) وطراز الروبوت (String).

يجب أن يظهر مخرجك سطرين—واحد لكل متحدث. لاحظ كيف يمكن معاملة كل من Human و Robot بشكل موحد من خلال واجهة Speaker، على الرغم من أنهما يتحدثان بطرق مختلفة تمامًا!

ورقة مرجعية

يستخدم الكلاس الكلمة المفتاحية implements لتنفيذ واجهة (interface) ويجب أن يوفر تنفيذات ملموسة لجميع الأساليب (methods) المعلن عنها في الواجهة:

public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

يُعد التعليق التوضيحي @Override اختيارياً ولكنه موصى به لأنه يساعد في اكتشاف الأخطاء.

يمكن استخدام الواجهات كأنواع مرجعية، مما يتيح تعدد الأشكال (polymorphism) حيث يمكن التعامل مع الكلاسات المختلفة التي تنفذ نفس الواجهة بشكل موحد:

Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);

shape1.draw();  // Drawing a circle with radius 5.0
shape2.draw();  // Drawing a rectangle 4.0 x 3.0

جرّب بنفسك

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة المدخلات
        String humanName = scanner.nextLine();
        String robotModel = scanner.nextLine();
        
        // TODO: إنشاء كائن Human بالاسم المعطى
        
        // TODO: إنشاء كائن Robot بالموديل المعطى
        
        // TODO: إنشاء مصفوفة من مراجع Speaker تحتوي على كلا الكائنين
        
        // TODO: التكرار عبر المصفوفة وطباعة نتيجة speak() لكل متحدث
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming