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

الوراثة الأحادية ومتعددة المستويات

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

حتى الآن، رأينا أصنافاً (classes) ترث من صنف أب واحد مباشرة. لكن الوراثة يمكن أن تشكل هياكل مختلفة اعتماداً على كيفية ارتباط الأصناف ببعضها البعض. دعونا نستكشف النمطين الرئيسيين: الوراثة الفردية و الوراثة متعددة المستويات.

الوراثة الفردية هي ما كنا نستخدمه. يمتد الصنف من صنف أب واحد فقط بشكل مباشر:

public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }

هنا، يرث كل من Dog و Cat من Animal، لكنهما لا يرثان من بعضهما البعض. كل ابن له أب مباشر واحد.

تُنشئ الوراثة متعددة المستويات سلسلة حيث ترث فئة (class) فئة أخرى، والتي بدورها ترث فئة أخرى:

public class Animal {
    public void eat() {
        System.out.println("Eating");
    }
}

public class Mammal extends Animal {
    public void breathe() {
        System.out.println("Breathing");
    }
}

public class Dog extends Mammal {
    public void bark() {
        System.out.println("Barking");
    }
}

في هذه السلسلة، يرث Dog من Mammal، والذي يرث بدوره من Animal. يمتلك كائن Dog إمكانية الوصول إلى جميع الدوال (methods) من السلسلة بأكملها:

Dog dog = new Dog();
dog.eat();      // من Animal
dog.breathe();  // من Mammal
dog.bark();     // من Dog

تذكر أن Object يقع في قمة كل سلسلة. لذا فإن Dog الخاص بنا يحتوي في الواقع على أربعة مستويات: Object -> Animal -> Mammal -> Dog. يتدفق تسلسل المنشئ (Constructor chaining) عبر كل هذه المستويات عند إنشاء كائن جديد.

challenge icon

التحدي

سهل

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

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

  • Vehicle.java: قم بإنشاء الفئة الأساسية (base class) في قمة التسلسل الهرمي الخاص بك. يجب أن تتوفر في كل مركبة:
    • حقل خاص (private field) لـ brand (String)
    • منشئ (constructor) يقبل العلامة التجارية (brand)
    • دالة getBrand() تعيد العلامة التجارية
    • دالة move() تطبع: [brand] is moving
  • LandVehicle.java: قم بإنشاء فئة ترث من Vehicle، لتمثل المستوى المتوسط في سلسلة الوراثة متعددة المستويات. تضيف المركبات البرية سلوكًا خاصًا بالأرض:
    • حقل خاص لـ wheels (int)
    • منشئ يأخذ العلامة التجارية والعجلات، باستخدام super(brand) للجزء الخاص بالأب
    • دالة getWheels() تعيد عدد العجلات
    • دالة honk() تطبع: [brand] honks!
  • Car.java: قم بإنشاء فئة ترث من LandVehicle، لتكمل سلسلة الوراثة المكونة من ثلاثة مستويات. تضيف السيارات ميزاتها المتخصصة:
    • حقل خاص لـ model (String)
    • منشئ يأخذ العلامة التجارية، والعجلات، والموديل، باستخدام super(brand, wheels)
    • دالة getModel() تعيد الموديل
    • دالة displayInfo() تطبع: [brand] [model] with [wheels] wheels
  • Main.java: وضح كيف يمكن لكائن من نوع Car الوصول إلى الدوال من جميع المستويات الثلاثة للتسلسل الهرمي. ستتلقى ثلاثة مدخلات: العلامة التجارية (String)، والعجلات (int)، والموديل (String). قم بإنشاء Car واستدعاء هذه الدوال بالترتيب:
    • move() - موروثة من Vehicle (الجد)
    • honk() - موروثة من LandVehicle (الأب)
    • displayInfo() - معرفة في Car نفسها

ستتلقى ثلاثة مدخلات: اسم العلامة التجارية، عدد العجلات، واسم الموديل.

يجب أن يظهر مخرجك ثلاثة أسطر توضح كيف يمكن لكائن Car استخدام الدوال من كل مستوى في سلسلة الوراثة الخاصة به - من المستوى الأعلى Vehicle وصولاً إلى فئته الخاصة!

ورقة مرجعية

تدعم جافا هياكل وراثة مختلفة. النمطان الرئيسيان هما الوراثة الفردية والوراثة متعددة المستويات.

تحدث الوراثة الفردية عندما يرث كلاس (class) من كلاس أب واحد فقط بشكل مباشر:

public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }

يرث كل من Dog و Cat من Animal، ولكن ليس من بعضهما البعض.

تنشئ الوراثة متعددة المستويات سلسلة حيث يرث كلاس من كلاس آخر، والذي بدوره يرث من كلاس آخر:

public class Animal {
    public void eat() {
        System.out.println("Eating");
    }
}

public class Mammal extends Animal {
    public void breathe() {
        System.out.println("Breathing");
    }
}

public class Dog extends Mammal {
    public void bark() {
        System.out.println("Barking");
    }
}

في الوراثة متعددة المستويات، يمتلك الكلاس الابن حق الوصول إلى جميع الدوال (methods) من سلسلة الوراثة بأكملها:

Dog dog = new Dog();
dog.eat();      // من Animal
dog.breathe();  // من Mammal
dog.bark();     // من Dog

يحتوي كل تسلسل هرمي للكلاسات على Object في القمة. يتدفق تسلسل المنشئات (Constructor chaining) عبر جميع المستويات عند إنشاء كائن جديد.

جرّب بنفسك

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // قراءة المدخلات
        String brand = scanner.nextLine();
        int wheels = scanner.nextInt();
        scanner.nextLine(); // استهلاك السطر الجديد
        String model = scanner.nextLine();
        
        // TODO: إنشاء كائن Car باستخدام قيم المدخلات
        
        // TODO: استدعاء move() - موروثة من Vehicle (الجد)
        
        // TODO: استدعاء honk() - موروثة من LandVehicle (الأب)
        
        // TODO: استدعاء displayInfo() - معرفة في Car نفسها
    }
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming