الوراثة
الوراثة (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).
📖 ملخص
- الوراثة تسمح بإنشاء فئة جديدة بناءً على فئة موجودة
- extends للوراثة
- super للوصول للفئة الأصلية
- @Override لتجاوز الدوال
- abstract class لا يمكن إنشاء كائنات منها مباشرة
- instanceof للتحقق من نوع الكائن
📝 تمارين
- أشكال هندسية: أنشئ فئة Shape مع فئات فرعية Circle و Rectangle و Triangle
- موظفين: أنشئ فئة Employee مع فئات فرعية Manager و Developer
- مركبات: أنشئ فئة Vehicle مع فئات فرعية Car و Motorcycle و Truck
الدرس التالي
في الدرس التالي، سنتعلم تعدد الأشكال — سلوكيات مختلفة لنفس الواجهة.



