الوحدة 6: الواجهات Interface والقوائم ArrayList · الموضوع 13 من 17
الموضوع 13

الواجهات Interface

الواجهة عقد يحدّد «ماذا» يجب أن يفعل الكلاس، ويترك له «كيف» يفعله.

«interface»Printable Student Book implements
بعد هذا الدرس ستستطيع أن:
  • تعرّف الواجهة interface، وتوضّح الفرق بينها وبين الكلاس المجرد.
  • تكتب واجهة، وتنفّذها في كلاس باستخدام implements.
  • تستخدم متغيرًا أو مصفوفة من نوع الواجهة لتخزين كائنات من كلاسات مختلفة.
  • تنفّذ أكثر من واجهة في كلاس واحد.

١ما هي الواجهة Interface؟

الواجهة interface قائمة بأسماء دوال بلا أجسام. أي كلاس يوقّع عليها بالكلمة implements يلتزم بكتابة جسم كل دالة فيها.
🔌 مقبس الكهرباءأي جهاز له القابس المناسب يعمل عليه، مهما كان نوعه. المقبس «واجهة» يلتزم بها الجميع.
📋 عقد العمليحدّد المهام المطلوبة من الموظف، ولا يحدّد كيف ينجزها.

تذكّر الكلاس المجرد abstract في الدرس السابق: الواجهة تشبهه، لكنها في صورتها الأساسية مجردة بالكامل؛ لا تحتوي دوالًا عادية ولا خصائص متغيرة.

٢كتابة الواجهة وتنفيذها

نكتب الواجهة بالكلمة interface بدل class:

Printable.java
public interface Printable {    void printInfo();   // دالة بلا جسم}

ثم ينفّذها الكلاس بالكلمة implements، ويكتب جسم الدالة:

Student.java
public class Student implements Printable {    int id;    String name;    double mark;     public Student(int id, String name, double mark) {        this.id = id;        this.name = name;        this.mark = mark;    }     @Override    public void printInfo() {        System.out.println("Student: " + id + " - " + name + " - " + mark);    }}
«interface»Printable+ printInfo() : voidStudent~ id : int~ name : String~ mark : double+ printInfo() : voidBook~ id : int~ title : String+ printInfo() : void
🧩 في UML تُكتب الواجهة بعنوان «interface»، والسهم المتقطع ذو الرأس المثلث الفارغ يعني «ينفّذ implements».
+ public- private# protected~ defaultمسطّر: staticمائل: abstract

٣مثال: كلاسان مختلفان ينفّذان الواجهة نفسها

الطالب والكتاب لا علاقة وراثة بينهما، لكن كليهما يستطيع أن «يطبع بياناته». الواجهة تجمعهما، فنضعهما في مصفوفة واحدة من نوع Printable:

public interface Printable {    void printInfo();   // دالة بلا جسم}
public class Student implements Printable {    int id;    String name;    double mark;     public Student(int id, String name, double mark) {        this.id = id;        this.name = name;        this.mark = mark;    }     @Override    public void printInfo() {        System.out.println("Student: " + id + " - " + name + " - " + mark);    }}
public class Book implements Printable {    int id;    String title;     public Book(int id, String title) {        this.id = id;        this.title = title;    }     @Override    public void printInfo() {        System.out.println("Book: " + id + " - " + title);    }}
public class Main {    public static void main(String[] args) {        Printable[] items = {            new Student(4321, "Mohammed", 80),            new Book(1, "Java in 10 days"),            new Student(4344, "Turki", 50)        };         for (Printable p : items) {            p.printInfo();        }    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
«interface»PrintableStudentBookMain
«interface»Printable+ printInfo() : voidStudent~ id : int~ name : String~ mark : double+ Student(id : int, name : String, mark : double)+ printInfo() : voidBook~ id : int~ title : String+ Book(id : int, title : String)+ printInfo() : voidMain+ main(args : String[]) : void

ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.

Output – Printable (run)×
run:
Student: 4321 - Mohammed - 80.0
Book: 1 - Java in 10 days
Student: 4344 - Turki - 50.0
BUILD SUCCESSFUL (total time: 0 seconds)

p من نوع Printable، لكن في كل دورة يحمل كائنًا مختلفًا، فتُنفَّذ نسخة الكائن الفعلي: هذا تعدد الأشكال الذي درسته.

٤تنفيذ أكثر من واجهة

الكلاس في جافا يرث كلاسًا واحدًا فقط بـ extends، لكنه يستطيع تنفيذ أكثر من واجهة بفاصلة بينها. البطة تسبح وتطير:

Duck.java
interface Swimmer {    void swim();} interface Flyer {    void fly();} class Duck implements Swimmer, Flyer {    public void swim() {        System.out.println("البطة تسبح");    }    public void fly() {        System.out.println("البطة تطير");    }} public class Main {    public static void main(String[] args) {        Duck d = new Duck();        d.swim();        d.fly();    }}
Output – JavaApplication (run)×
run:
البطة تسبح
البطة تطير
BUILD SUCCESSFUL (total time: 0 seconds)

٥الكلاس المجرد أم الواجهة؟

abstract classinterface
الكلمةextendsimplements
عدد ما يرثه/ينفّذه الكلاسكلاس واحد فقطأكثر من واجهة
الدوالمجردة وعاديةمجردة (في صورتها الأساسية)
الخصائصأي خصائصثوابت فقط
إنشاء كائن منهلالا
متى نستخدمه؟كلاسات متقاربة بينها كود مشتركقدرة مشتركة بين كلاسات مختلفة
التدريب العملي 17: واجهة الطباعة Printableواجهة Printable ينفّذها كلاسا Student و Book، ثم نطبع بياناتهما من مصفوفة واحدة.افتح التدريب ←

توقّع وتحقّق

أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.

الكلمة التي تجعل الكلاس ينفّذ واجهة:

ما الذي يجب على الكلاس الذي ينفّذ الواجهة Printable؟

أي سطر صحيح؟

إذا كان الكلاس Book ينفّذ الواجهة Printable:

لا يُنشأ كائن من الواجهة، لكن متغير الواجهة يحمل كائنًا من كلاس ينفّذها.

كم واجهة يستطيع الكلاس الواحد أن ينفّذها؟

الخلاصة

انتقل إلى تقييم الدرسأسئلة التقييم، وأكمل الفراغات.ابدأ التقييم ←