الوراثة

الوراثة (Inheritance) تسمح بإنشاء فئة جديدة بناءً على فئة موجودة. الفئة الجديدة ترث خصائص وسلوكيات الفئة الأصلية.

مفهوم الوراثة

المفهوم الوصف
الفئة الأصلية (Superclass/Parent) الفئة التي تُورث منها
الفئة الفرعية (Subclass/Child) الفئة التي ترث
extends كلمة مفتاحية للوراثة

مثال أساسي

JAVA
// الفئة الأصلية
public class Animal {
    protected String name;
    protected int age;
    
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public void eat() {
        System.out.println(name + " يأكل");
    }
    
    public void sleep() {
        System.out.println(name + " ينام");
    }
    
    @Override
    public String toString() {
        return name + "، العمر: " + age;
    }
}

// الفئة الفرعية
public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, int age, String breed) {
        super(name, age);  // استدعاء مُنشئ الفئة الأصلية
        this.breed = breed;
    }
    
    public void bark() {
        System.out.println(name + " ينبح: ووف ووف!");
    }
    
    @Override
    public String toString() {
        return super.toString() + "، السلالة: " + breed;
    }
}

// الاستخدام
Dog dog = new Dog("ريكس", 3, "جيرمن شيبرد");
dog.eat();    // يرث من Animal
dog.sleep();  // يرث من Animal
dog.bark();   // خاص بـ Dog
System.out.println(dog);  // ريكس، العمر: 3، السلالة: جيرمن شيبرد

super — الإشارة للفئة الأصلية

JAVA
public class Cat extends Animal {
    private boolean isIndoor;
    
    public Cat(String name, int age, boolean isIndoor) {
        super(name, age);  // استدعاء مُنشئ Animal
        this.isIndoor = isIndoor;
    }
    
    @Override
    public void eat() {
        super.eat();  // استدعاء eat من Animal
        System.out.println(name + " يأكل طعام القطط");
    }
}

تجاوز الدوال (Method Overriding)

JAVA
public class Animal {
    public void makeSound() {
        System.out.println("صوت عام");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("ووف ووف!");
    }
}

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

instanceof — التحقق من النوع

JAVA
Animal animal = new Dog("ريكس", 3, "جيرمن شيبرد");

System.out.println(animal instanceof Animal);  // true
System.out.println(animal instanceof Dog);      // true
System.out.println(animal instanceof Cat);      // false

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

JAVA
public class Animal {
    public void eat() { System.out.println("أكل"); }
}

public class Mammal extends Animal {
    public void walk() { System.out.println("مشي"); }
}

public class Dog extends Mammal {
    public void bark() { System.out.println("نباح"); }
}

// Dog يرث من Mammal و Animal
Dog dog = new Dog();
dog.eat();   // من Animal
dog.walk();  // من Mammal
dog.bark();  // من Dog

الفئات المجردة (Abstract Classes)

JAVA
public abstract class Shape {
    protected String color;
    
    public Shape(String color) {
        this.color = color;
    }
    
    // دالة مجردة — يجب تنفيذها في الفئات الفرعية
    public abstract double getArea();
    public abstract double getPerimeter();
    
    // دالة عادية
    public String getColor() {
        return color;
    }
}

public class Circle extends Shape {
    private double radius;
    
    public Circle(String color, double radius) {
        super(color);
        this.radius = radius;
    }
    
    @Override
    public double getArea() {
        return Math.PI * radius * radius;
    }
    
    @Override
    public double getPerimeter() {
        return 2 * Math.PI * radius;
    }
}

❓ أسئلة شائعة

س لماذا نستخدم protected بدلاً من private؟
ج protected تسمح للفئات الفرعية بالوصول للمتغيرات. private لا تسمح بذلك.
س هل يمكن الوراثة من عدة فئات؟
ج لا، Java تدعم الوراثة من فئة واحدة فقط. لكن يمكنك تنفيذ عدة واجهات.
س ما الفرق بين abstract و interface؟
ج abstract class يمكن أن تحتوي على كود عادي. interface تحتوي على دوال مجردة فقط (قبل Java 8).

📖 ملخص

📝 تمارين

  1. أشكال هندسية: أنشئ فئة Shape مع فئات فرعية Circle و Rectangle و Triangle
  2. موظفين: أنشئ فئة Employee مع فئات فرعية Manager و Developer
  3. مركبات: أنشئ فئة Vehicle مع فئات فرعية Car و Motorcycle و Truck

الدرس التالي

في الدرس التالي، سنتعلم تعدد الأشكال — سلوكيات مختلفة لنفس الواجهة.

100%