الواجهات (Interfaces) في جافا
ما هي الواجهات (Interfaces) في جافا؟
الواجهات (Interfaces) في جافا هي نوع خاص من الكائنات التي تُستخدم لتعريف مجموعة من الدوال (Methods) التي يجب على الفئة (Class) التي تطبق هذه الواجهة أن تنفذها. الواجهة في جافا تشبه الفئة المجردة (Abstract Class) إلى حد ما، ولكنها لا تحتوي على أي تنفيذات للدوال. الواجهات تلعب دورًا مهمًا في تطبيق الوراثة المتعددة (Multiple Inheritance) في جافا.
الفرق بين الفئات والواجهات
- **الوراثة:** في جافا، الفئة يمكن أن ترث من فئة واحدة فقط، ولكن يمكن أن تطبق عدة واجهات.
- **التنفيذ:** الواجهات لا تحتوي على أي تنفيذات للدوال، بينما يمكن أن تحتوي الفئات على دوال بداخلها.
- **الكلمات المفتاحية:** يتم استخدام
implements
لتطبيق واجهة، بينما يتم استخدامextends
للوراثة من فئة.
كيفية إنشاء واجهة في جافا
لإنشاء واجهة في جافا، نستخدم الكلمة المفتاحية interface
، ثم نحدد الدوال التي يجب أن تطبقها الفئة التي تنفذ الواجهة. الصيغة العامة هي:
interface InterfaceName {
// تعريف الدوال بدون تنفيذ
returnType methodName(parameters);
}
مثال:
interface Animal {
void eat(); // دالة بدون تنفيذ
void sleep(); // دالة بدون تنفيذ
}
كيفية تطبيق واجهة في جافا
لتطبيق واجهة على فئة، نستخدم الكلمة المفتاحية implements
، ثم نقوم بتنفيذ الدوال المحددة في الواجهة داخل الفئة. الصيغة العامة هي:
class ClassName implements InterfaceName {
// تنفيذ الدوال المحددة في الواجهة
public void methodName(parameters) {
// الكود الخاص بتنفيذ الدالة
}
}
مثال:
interface Animal {
void eat();
void sleep();
}
class Dog implements Animal {
public void eat() {
System.out.println("الكلب يأكل");
}
public void sleep() {
System.out.println("الكلب ينام");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat();
myDog.sleep();
}
}
في هذا المثال، قمنا بإنشاء واجهة Animal
تحتوي على دوال eat
و sleep
. ثم قمنا بإنشاء فئة Dog
تطبق هذه الواجهة وتوفر تنفيذًا للدوال.
تطبيق وراثة متعددة باستخدام الواجهات
في جافا، لا يمكن للفئة أن ترث من أكثر من فئة، ولكن يمكنها تطبيق عدة واجهات. هذا يوفر طريقة غير مباشرة لتحقيق الوراثة المتعددة. يمكنك تطبيق واجهتين أو أكثر باستخدام فاصلة بين أسمائهما.
مثال:
interface Animal {
void eat();
}
interface Pet {
void play();
}
class Dog implements Animal, Pet {
public void eat() {
System.out.println("الكلب يأكل");
}
public void play() {
System.out.println("الكلب يلعب");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat();
myDog.play();
}
}
في هذا المثال، الفئة Dog
تطبق كلًا من الواجهة Animal
والواجهة Pet
، مما يسمح للفئة بتنفيذ دوال من كلا الواجهتين.
الواجهات الافتراضية (Default Methods) في جافا
ابتداءً من الإصدار جافا 8، يمكن للواجهات أن تحتوي على دوال افتراضية (Default Methods)، وهي دوال تأتي مع تنفيذ افتراضي. هذه الدوال لا تتطلب من الفئة التي تطبق الواجهة أن توفر تنفيذًا لها، إلا إذا أرادت تجاوزها (Override).
مثال:
interface Animal {
void eat();
default void breathe() {
System.out.println("التنفس");
}
}
class Dog implements Animal {
public void eat() {
System.out.println("الكلب يأكل");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat();
myDog.breathe(); // تنفيذ الدالة الافتراضية
}
}
في هذا المثال، تحتوي الواجهة Animal
على دالة افتراضية breathe
، ويمكن للفئة Dog
استدعاء هذه الدالة دون الحاجة إلى توفير تنفيذ خاص بها.
تمرين (مستوى متوسط): إنشاء واجهة لمشغل وسائط
في هذا التمرين، سنقوم بإنشاء واجهة تمثل مشغل وسائط (Media Player) تحتوي على دوال لتشغيل وإيقاف الوسائط. سنقوم بعد ذلك بإنشاء فئتين تطبقان هذه الواجهة: فئة مشغل موسيقى وفئة مشغل فيديو.
المتطلبات:
- إنشاء واجهة
MediaPlayer
تحتوي على دوالplay
وstop
. - إنشاء فئة
MusicPlayer
تطبق الواجهة وتوفر تنفيذًا لتشغيل الموسيقى وإيقافها. - إنشاء فئة
VideoPlayer
تطبق الواجهة وتوفر تنفيذًا لتشغيل الفيديو وإيقافه.
الكود:
interface MediaPlayer {
void play();
void stop();
}
class MusicPlayer implements MediaPlayer {
public void play() {
System.out.println("تشغيل الموسيقى");
}
public void stop() {
System.out.println("إيقاف الموسيقى");
}
}
class VideoPlayer implements MediaPlayer {
public void play() {
System.out.println("تشغيل الفيديو");
}
public void stop() {
System.out.println("إيقاف الفيديو");
}
}
public class Main {
public static void main(String[] args) {
MediaPlayer myMusicPlayer = new MusicPlayer();
myMusicPlayer.play();
myMusicPlayer.stop();
MediaPlayer myVideoPlayer = new VideoPlayer();
myVideoPlayer.play();
myVideoPlayer.stop();
}
}
شرح الكود:
- قمنا بإنشاء واجهة
MediaPlayer
تحتوي على دوالplay
وstop
. - قمنا بإنشاء فئتين،
MusicPlayer
وVideoPlayer
، كل فئة توفر تنفيذًا مختلفًا للدوال. - قمنا بإنشاء كائنات من كل فئة، واستدعينا الدوال لتشغيل وإيقاف الموسيقى والفيديو.
جرّب تنفيذ هذا البرنامج بنفسك، وشارك نتيجتك معنا في التعليقات! إذا واجهتك أي مشكلة أو كان لديك سؤال، لا تتردد في طرحه.
خاتمة
في هذا الدرس، تعرفنا على الواجهات في جافا، وكيفية استخدامها لتطبيق الوراثة المتعددة. كما تعرفنا على كيفية إنشاء واجهات وتطبيقها في الفئات. نوصي بممارسة التمرين المقدم لاكتساب المزيد من الخبرة. لا تنسَ ترك تعليق أو مشاركة هذا الدرس مع أصدقائك على وسائل التواصل الاجتماعي إذا وجدته مفيدًا!
اترك تعليقاً