الوراثة (Inheritance) في لغة جافا

Amine
30/09/2024

ما هي الوراثة (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 لتسهيل الوصول إلى مكونات الفئة الأساسية. لا تنسَ ترك تعليق أو مشاركة هذا الدرس مع أصدقائك على وسائل التواصل الاجتماعي إذا وجدته مفيدًا!

التعليقات

اترك تعليقاً