الوراثة (Inheritance) في لغة جافا
ما هي الوراثة (Inheritance) في جافا؟
الوراثة (Inheritance) في جافا هي إحدى مبادئ البرمجة الكائنية (Object-Oriented Programming – OOP)، والتي تتيح للفئة (Class) أن ترث خصائص وسلوكيات فئة أخرى. الفئة التي تقوم بالوراثة تسمى “فئة الابن” (Child Class) أو “الفئة الفرعية” (Subclass)، والفئة التي يتم الوراثة منها تسمى “فئة الأب” (Parent Class) أو “الفئة الأساسية” (Superclass).
باستخدام الوراثة، يمكننا إنشاء فئات جديدة بناءً على فئات موجودة، مما يُسهّل إعادة استخدام الكود ويوفر وقتًا وجهدًا في تطوير البرامج.
كيفية تطبيق الوراثة في جافا
لإنشاء فئة ابن (Subclass) ترث من فئة أب (Superclass)، نستخدم الكلمة المفتاحية extends
. الصيغة العامة هي:
class ChildClass extends ParentClass {
// خصائص ودوال إضافية يمكن إضافتها إلى فئة الابن
}
مثال:
class Animal {
void eat() {
System.out.println("الحيوان يأكل");
}
}
class Dog extends Animal {
void bark() {
System.out.println("الكلب ينبح");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // استدعاء الدالة من الفئة الأب Animal
myDog.bark(); // استدعاء الدالة من فئة الابن Dog
}
}
في هذا المثال، قمنا بإنشاء فئة Animal
تحتوي على دالة eat
. ثم قمنا بإنشاء فئة Dog
ترث من Animal
، مما يتيح لها الوصول إلى دالة eat
، بالإضافة إلى دالتها الخاصة bark
.
الكلمة المفتاحية super
الكلمة المفتاحية super
تُستخدم للإشارة إلى دالة أو خاصية الفئة الأب من داخل فئة الابن. يمكن استخدام super
لاستدعاء دالة الفئة الأب أو الوصول إلى الخصائص الموروثة.
مثال:
class Animal {
String color = "أسود";
void eat() {
System.out.println("الحيوان يأكل");
}
}
class Dog extends Animal {
String color = "بني";
void displayColor() {
System.out.println("لون الكلب: " + color); // اللون الخاص بفئة Dog
System.out.println("لون الحيوان: " + super.color); // اللون الموروث من الفئة الأب Animal
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.displayColor(); // استدعاء الدالة لعرض الألوان
}
}
في هذا المثال، قمنا بإنشاء خاصية color
في كل من فئة Animal
و Dog
. باستخدام super.color
، استدعينا قيمة الخاصية color
من الفئة الأب.
الوراثة المتعددة (Multiple Inheritance) في جافا
في جافا، لا يمكن للفئة أن ترث من أكثر من فئة واحدة بشكل مباشر، حيث يتم استخدام الوراثة الفردية (Single Inheritance) فقط. لتطبيق الوراثة المتعددة، يمكنك استخدام واجهات (Interfaces)، والتي سيتم شرحها في الدروس القادمة.
تجاوز الدوال (Method Overriding)
تجاوز الدوال (Method Overriding) يُستخدم عندما تريد إعادة تعريف دالة موجودة في الفئة الأب داخل فئة الابن. يتم استخدام الكلمة المفتاحية @Override
قبل الدالة للإشارة إلى أنه قد تم تجاوزها.
مثال:
class Animal {
void eat() {
System.out.println("الحيوان يأكل");
}
}
class Dog extends Animal {
@Override
void eat() {
System.out.println("الكلب يأكل طعام الكلاب");
}
}
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.eat(); // استدعاء الدالة المُتجاوزة من فئة Dog
}
}
في هذا المثال، قمنا بتجاوز الدالة eat
في الفئة Dog
لتعطي سلوكًا مختلفًا عن الدالة في الفئة Animal
.
تمرين (مستوى متوسط): إنشاء فئة لإدارة الحسابات البنكية
في هذا التمرين، سنقوم بإنشاء فئة رئيسية تمثل حسابًا بنكيًا، وفئة ابن تمثل حساب توفير.
المتطلبات:
- إنشاء فئة باسم
BankAccount
تحتوي على خاصيتين:accountNumber
وbalance
. - إنشاء دالة للإيداع (deposit) ودالة للسحب (withdraw) داخل الفئة.
- إنشاء فئة ابن باسم
SavingsAccount
ترث من الفئةBankAccount
وتحتوي على دالة لحساب الفائدة (calculateInterest). - إنشاء كائن من فئة
SavingsAccount
في الدالة الرئيسية، وتنفيذ العمليات.
الكود:
class BankAccount {
String accountNumber;
double balance;
BankAccount(String accountNumber, double balance) {
this.accountNumber = accountNumber;
this.balance = balance;
}
void deposit(double amount) {
balance += amount;
System.out.println("تم إيداع: " + amount + " ر.س");
}
void withdraw(double amount) {
if (balance >= amount) {
balance -= amount;
System.out.println("تم سحب: " + amount + " ر.س");
} else {
System.out.println("الرصيد غير كافٍ");
}
}
void displayBalance() {
System.out.println("رصيد الحساب: " + balance + " ر.س");
}
}
class SavingsAccount extends BankAccount {
double interestRate;
SavingsAccount(String accountNumber, double balance, double interestRate) {
super(accountNumber, balance);
this.interestRate = interestRate;
}
void calculateInterest() {
double interest = balance * interestRate / 100;
balance += interest;
System.out.println("الفائدة المضافة: " + interest + " ر.س");
}
}
public class Main {
public static void main(String[] args) {
SavingsAccount myAccount = new SavingsAccount("123456", 1000.0, 5.0); // إنشاء حساب توفير
myAccount.deposit(500); // إيداع
myAccount.withdraw(200); // سحب
myAccount.calculateInterest(); // حساب الفائدة
myAccount.displayBalance(); // عرض الرصيد
}
}
شرح الكود:
- أنشأنا فئة
BankAccount
تحتوي على خصائص ودوال للإيداع والسحب. - أنشأنا فئة ابن
SavingsAccount
ترث منBankAccount
وتحتوي على دالة لحساب الفائدة. - استخدمنا الكلمة المفتاحية
super
لاستدعاء مُنشئ الفئة الأب من داخل فئة الابن.
جرّب تنفيذ هذا البرنامج بنفسك، وشارك نتيجتك معنا في التعليقات! إذا واجهتك أي مشكلة أو كان لديك سؤال، لا تتردد في طرحه.
خاتمة
في هذا الدرس، تعرفنا على الوراثة في جافا وكيفية استخدام الفئات الأبناء للوصول إلى خصائص ودوال الفئة الأب. كما تناولنا استخدام الكلمة المفتاحية super
لتسهيل الوصول إلى مكونات الفئة الأساسية. لا تنسَ ترك تعليق أو مشاركة هذا الدرس مع أصدقائك على وسائل التواصل الاجتماعي إذا وجدته مفيدًا!
اترك تعليقاً