- يتيح الميراث إعادة استخدام الكود وتوسيعه بكفاءة، مما يعزز النمطية في التصميم.
- يمكن إنشاء فئات فرعية ترث الميزات المشتركة من فئة رئيسية، وتخصصها حسب الحاجة.
- توفر اللغات مثل Java وPython وC# تنفيذات وقيودًا مختلفة للوراثة.

لقد أحدثت البرمجة كائنية التوجه (OOP) نقلة نوعية في كيفية هيكلة المطورين لمشاريعهم وتنظيمها. وفي هذا النموذج، يلعب التوريث دورًا أساسيًا، إذ يسمح بإعادة استخدام الكود وتطويره بكفاءة. ولكن ما هو التوريث تحديدًا في البرمجة كائنية التوجه، ولماذا هو بالغ الأهمية؟
الميراث ليس مجرد مفهوم تقني؛ هي أداة قوية تساعد المطورين على إنشاء نموذج للعالم الحقيقي بشكل أكثر حدسيًا. تسمح هذه الآلية لفئة واحدة بالاشتقاق من فئة أخرى، ووراثة سماتها وطرقها. في هذه المقالة سوف نستكشف بالتفصيل كيفية عملها ومزاياها وأمثلة عملية والميزات الرئيسية لهذا العنصر الأساسي من OOP.
ما هو الميراث في البرمجة الشيئية؟
الوراثة آلية في البرمجة كائنية التوجه تسمح باستخدام خصائص وأساليب الفئة الأصلية في الفئات المشتقة أو الفرعية. تشجع هذه الآلية إعادة استخدام الكود من خلال توسيع وتخصيص السلوك المحدد في الفئات الأصلية. ببساطة، إذا كان لديك فئة أصلية تُسمى "مركبة"، يمكنك إنشاء فئات فرعية مثل "سيارة" أو "دراجة نارية" ترث الخصائص المشتركة لـ "مركبة".
تعتبر الفئة الأصلية بمثابة تعميم، في حين تعتبر الفئات الفرعية تخصصات. على سبيل المثال، إذا قامت الفئة الأصلية بتعريف طريقة "نقل"، فيمكن للفئات المشتقة استخدامها، أو توسيعها، أو حتى إعادة تعريفها وفقًا لسلوكياتها المحددة.
فوائد الميراث
- إعادة استخدام الكود: من خلال وراثة السمات والطرق من فئة أساسية، يمكنك تجنب تكرار التعليمات البرمجية في الفئات المشتقة.
- التمدد: يسمح لك بإضافة وظائف جديدة أو تعديل الوظائف الموجودة في الفئات المشتقة.
- التنظيم الهرمي: إنه يسهل هيكلة الكود في التسلسلات الهرمية المنطقية، مما يعكس العلاقات في العالم الحقيقي.
- التوحيد القياسي: يحافظ على الاتساق في الأساليب والسمات المشتركة بين الفئات ذات الصلة.
العلاقة بين الفئات: الفئة الأساسية والفئة المشتقة
في البنية الهرمية، تحدد الفئة الأساسية، والمعروفة أيضًا بالفئة العليا ، الخصائص والسلوكيات المشتركة التي يمكن توريثها. ترث الفئات المشتقة ، أو الفئات الفرعية، هذه الخصائص ويمكنها التخصص بإضافة سمات أو أساليب جديدة، أو بتجاوز السمات أو الأساليب الموجودة.
على سبيل المثال، إذا قمنا بتعريف فئة أساسية تسمى "حيوان"، فيمكننا إنشاء فئات فرعية مثل "ثدييات" أو "زواحف". وبالتالي، فإنهم جميعًا يشتركون في خصائص مشتركة مثل "التنفس"، ولكن قد تكون لكل منهم طرق محددة اعتمادًا على طبيعته، مثل "الرضاعة الطبيعية" في حالة الثدييات.
مثال على الكود: الميراث في اللغات المختلفة
دعونا نرى كيف يتم استخدام الميراث في بعض لغات البرمجة الأكثر شعبية:
الميراث في بايثون
يتم تنفيذ الميراث عن طريق تمرير الفئة الأساسية كحجة في تعريف الفئة المشتقة:
class Animal:
def __init__(self, especie):
self.especie = especie
def mover(self):
print("El animal se está moviendo")
class Perro(Animal):
def ladrar(self):
print("Guau, guau")
mi_perro = Perro("Canino")
mi_perro.mover()
mi_perro.ladrar()
الميراث في جافا
في لغة جافا، تُستخدم الكلمة المفتاحية extends لإنشاء علاقة الوراثة:
public class Animal {
public void mover() {
System.out.println("El animal se está moviendo.");
}
}
public class Perro extends Animal {
public void ladrar() {
System.out.println("Guau, guau");
}
}
public class Main {
public static void main(String[] args) {
Perro miPerro = new Perro();
miPerro.mover();
miPerro.ladrar();
}
}
الميراث في C#
في لغة C#، يتم استخدام الوراثة بشكل مشابه للغة Java، باستخدام الكلمة المفتاحية ` :` للإشارة إلى أن فئة ما ترث من فئة أخرى:
class Animal {
public void Mover() {
Console.WriteLine("El animal se está moviendo.");
}
}
class Perro : Animal {
public void Ladrar() {
Console.WriteLine("Guau, guau");
}
}
class Program {
static void Main(string[] args) {
Perro miPerro = new Perro();
miPerro.Mover();
miPerro.Ladrar();
}
}
الوراثة البسيطة والوراثة المتعددة
تدعم العديد من لغات البرمجة، مثل جافا وسي شارب، الوراثة الأحادية فقط ، أي أن الفئة المشتقة لا يمكنها أن ترث إلا من فئة أساسية واحدة. أما لغات مثل بايثون فتسمح بالوراثة المتعددة ، حيث يمكن للفئة أن ترث من عدة فئات أساسية.
استخدام الأساليب والتجاوز
واحدة من الميزات الأكثر فائدة في الميراث هي القدرة على تجاوز أساليب الفئة الأساسية. يتيح هذا إمكانية تخصيص سلوك الطريقة وفقًا للاحتياجات المحددة للفئة المشتقة.
على سبيل المثال، إذا كانت الفئة الأساسية تحتوي على طريقة "نقل"، فيمكن للفئة المشتقة تجاوزها لتحديد كيفية النقل:
class Vehiculo {
public void mover() {
System.out.println("El vehículo se está moviendo.");
}
}
class Coche extends Vehiculo {
@Override
public void mover() {
System.out.println("El coche está avanzando por la carretera.");
}
}
في هذه الحالة، إذا تم استدعاء طريقة "move" من كائن من فئة "Car"، فسيتم تنفيذ الإصدار المحدد من تلك الفئة.
تعدد الأشكال والوراثة
التعدد الأشكال هو مفهوم أساسي يتعلق بالوراثة. يسمح بمعالجة الكائن كمثال لفئته الأساسية، مع الاحتفاظ بالسلوك المحدد في فئته المشتقة. يُعد هذا مفيدًا بشكل خاص في الهياكل مثل القوائم أو المصفوفات التي تحتوي على كائنات من أنواع مختلفة.
على سبيل المثال:
Animal[] animales = { new Perro(), new Gato() };
for (Animal animal : animales) {
animal.hacerSonido();
}
يعد الوراثة أداة قوية في البرمجة الموجهة للكائنات والتي لا تسمح بإعادة استخدام التعليمات البرمجية فحسب، بل إنها تنشئ أيضًا علاقات هرمية بين الفئات وتشجع على تصميم برمجي أكثر تنظيماً ومرونة. إن فهم أساسياتها وكيفية تطبيقها بشكل صحيح أمر ضروري لأي مطور يريد كتابة كود فعال وقابل للصيانة.