الواجهات Interface
الواجهة عقد يحدّد «ماذا» يجب أن يفعل الكلاس، ويترك له «كيف» يفعله.
- تعرّف الواجهة interface، وتوضّح الفرق بينها وبين الكلاس المجرد.
- تكتب واجهة، وتنفّذها في كلاس باستخدام implements.
- تستخدم متغيرًا أو مصفوفة من نوع الواجهة لتخزين كائنات من كلاسات مختلفة.
- تنفّذ أكثر من واجهة في كلاس واحد.
١ما هي الواجهة Interface؟
تذكّر الكلاس المجرد abstract في الدرس السابق: الواجهة تشبهه، لكنها في صورتها الأساسية مجردة بالكامل؛ لا تحتوي دوالًا عادية ولا خصائص متغيرة.
٢كتابة الواجهة وتنفيذها
نكتب الواجهة بالكلمة interface بدل class:
public interface Printable { void printInfo(); // دالة بلا جسم}
ثم ينفّذها الكلاس بالكلمة implements، ويكتب جسم الدالة:
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 ومجردة تلقائيًّا، فلا نكتب لها جسمًا.
- الكلاس الذي ينفّذ الواجهة يجب أن يكتب جميع دوالها، وإلا ظهر خطأ ترجمة.
- لا يمكن إنشاء كائن من الواجهة:
new Printable()خطأ. - لكن يمكن أن يكون المتغير أو المصفوفة من نوع الواجهة، كما في المثال التالي.
٣مثال: كلاسان مختلفان ينفّذان الواجهة نفسها
الطالب والكتاب لا علاقة وراثة بينهما، لكن كليهما يستطيع أن «يطبع بياناته». الواجهة تجمعهما، فنضعهما في مصفوفة واحدة من نوع Printable:
public interface Printable { void printInfo(); // دالة بلا جسم}
ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.
p من نوع Printable، لكن في كل دورة يحمل كائنًا مختلفًا، فتُنفَّذ نسخة الكائن الفعلي: هذا تعدد الأشكال الذي درسته.
٤تنفيذ أكثر من واجهة
الكلاس في جافا يرث كلاسًا واحدًا فقط بـ extends، لكنه يستطيع تنفيذ أكثر من واجهة بفاصلة بينها. البطة تسبح وتطير:
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(); }}
٥الكلاس المجرد أم الواجهة؟
| abstract class | interface | |
|---|---|---|
| الكلمة | extends | implements |
| عدد ما يرثه/ينفّذه الكلاس | كلاس واحد فقط | أكثر من واجهة |
| الدوال | مجردة وعادية | مجردة (في صورتها الأساسية) |
| الخصائص | أي خصائص | ثوابت فقط |
| إنشاء كائن منه | لا | لا |
| متى نستخدمه؟ | كلاسات متقاربة بينها كود مشترك | قدرة مشتركة بين كلاسات مختلفة |
توقّع وتحقّق
أجب قبل أن تنظر إلى الشرح. التصحيح فوري، وإجاباتك تُحفظ.
الكلمة التي تجعل الكلاس ينفّذ واجهة:
ما الذي يجب على الكلاس الذي ينفّذ الواجهة Printable؟
أي سطر صحيح؟
إذا كان الكلاس Book ينفّذ الواجهة Printable:
كم واجهة يستطيع الكلاس الواحد أن ينفّذها؟
الخلاصة
- الواجهة interface قائمة دوال بلا أجسام، وتُنفَّذ بالكلمة implements.
- الكلاس المنفِّذ يكتب جميع دوال الواجهة.
- لا يُنشأ كائن من الواجهة، لكن يمكن أن يكون المتغير من نوعها.
- الكلاس يرث كلاسًا واحدًا، وينفّذ أكثر من واجهة.