الانتقال إلى المحتوى الرئيسي
الوحدة 3 · الدرس 1 من 25/14 في الدورة~12 min
دروس الوحدة (1/2)

الميراث

الوراثة هي آلية أساسية لـ OOP تسمح لفئة (تسمى فئة فرعية أو فئة فرعية) بوراثة الحقول والأساليب من فئة أخرى (تسمى فئة أصل أو فئة فائقة).

وهذا يعزز إعادة استخدام التعليمات البرمجية ويتجنب التكرار غير الضروري.

تمديد الفصل الدراسي باستخدام extends

في Java، نستخدم الكلمة الأساسية extends للإشارة إلى أن فئة ما ترث من فئة أخرى:

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

المنشئ والكلمة الرئيسية super()

إذا كانت الفئة الفائقة تحتوي على مُنشئ يقبل المعلمات، فيجب أن تستدعيها الفئة الفرعية بشكل صريح في مُنشئها باستخدام super(...) باعتبارها العبارة الأولى:

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

تجاوز الطريقة (@Override)

يمكن أن توفر الفئة الفرعية تطبيقًا محددًا خاصًا بها لطريقة موروثة من الفئة الفائقة. تسمى هذه العملية التجاوز (تجاوز الطريقة) ويتم الإشارة إليها بواسطة التعليق التوضيحي @Override.

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

المُعدِّل protected

يلعب معدّل الوصول protected دورًا رئيسيًا في الميراث. على عكس private، الذي يجعل الأعضاء مرئيين فقط داخل نفس الفئة، protected يسمح بالوصول إلى الحقول والأساليب داخل نفس الحزمة وبواسطة جميع الفئات الفرعية، حتى لو كانت موجودة في حزم مختلفة.

الوصول إلى الأعضاء الأصليين باستخدام super

بالإضافة إلى استدعاء منشئ الفئة الفائقة، يمكن استخدام الكلمة الأساسية super ضمن أساليب الفئة الفرعية للإشارة إلى أساليب أو متغيرات الفئة الأصلية. يعد هذا مفيدًا بشكل خاص عندما يتم تجاوز طريقة ما، ولكنك لا تزال ترغب في استدعاء السلوك الأصلي الأصلي:

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

وراثة واحدة في جاوة

في Java، يمكن للفئة توسيع فئة واحدة فقط (وراثة واحدة). لا يُسمح بالميراث المباشر من فئات متعددة (الميراث المتعدد)؛ على سبيل المثال، class Cat extends Animal, Mammal سوف يسبب خطأ في الترجمة. يتجنب اختيار التصميم هذا الغموض المعروف باسم "مشكلة الماس" (عندما تحدد فئتان فائقتان نفس الطريقة مع تطبيقات مختلفة). للتغلب على هذا القيد، تقدم Java مفهوم الواجهات، والذي سنستكشفه في الوحدة التالية.


جربه بنفسك

تمرين#java.m3.l1.e1
المحاولات: 0جارٍ التحميل…

أكمل فئة الكلب الفرعية عن طريق توسيع الحيوان. قم بتعريف مُنشئ Dog الذي يقبل الاسم (سلسلة) ويستخدم super(name) لتمريره إلى مُنشئ الحيوان.

جارٍ تحميل المحرر…
إظهار التلميح

اكتب `Public Dog(String name) { super(name); }` داخل فئة الكلب.

الحل متاح بعد 3 من المحاولات

تمرين#java.m3.l1.e2
المحاولات: 0جارٍ التحميل…

قم بتوسيع Dog من Animal وتجاوز طريقة makeSound() بحيث تقوم بإرجاع السلسلة Woof بدلاً من Generic Sound. استخدم التعليق التوضيحيOverride.

جارٍ تحميل المحرر…
إظهار التلميح

اكتب `@Override` فوق الإعلان `public String makeSound() { return 'Woof'; }` داخل الكلب.

الحل متاح بعد 3 من المحاولات

تمرين#java.m3.l1.e3
المحاولات: 0جارٍ التحميل…

قم بتعريف فئة Cat التي تمتد إلى Animal وتتجاوز طريقة makeSound () لإرجاع السلسلة Meow. تحتوي فئة Animal بالفعل على مُنشئ يقبل الاسم؛ تأكد من أن مُنشئ Cat يقبل أيضًا الاسم ويمرره بشكل صحيح إلى مُنشئ الفئة الفائقة.

جارٍ تحميل المحرر…
إظهار التلميح

قم بإنشاء فئة "Cat" التي تمتد إلى "Animal". قم بتعريف المنشئ `public Cat(String name) { super(name); }` وتجاوز طريقة `makeSound()` باستخدام `@Override` لإرجاع ``Meow'`.

الحل متاح بعد 3 من المحاولات