ما هي الوراثة؟
الوراثة (Inheritance) هي أحد المبادئ الأساسية في البرمجة كائنية التوجه.
فكرتها بسيطة جدًا: بدلاً من إعادة كتابة الخصائص والدوال نفسها في أكثر من نموذج، يمكننا إنشاء نموذج جديد يرث كل ما هو موجود في نموذج آخر، ثم نضيف إليه ما نحتاجه فقط.
بهذه الطريقة نقلل تكرار الكود (Code Duplication) ونجعل النماذج أكثر قابلية لإعادة الاستخدام.
مثال
لنفترض أننا نملك نموذجًا يمثل سيارة عادية.
class Car { constructor(color, model) { this.color = color; this.model = model; }
beepSound() { console.log("beeeeeeeeeep"); }}
class ElectricCar extends Car { constructor(color, model, battery) { super(color, model); this.battery = battery; }}
const eCar = new ElectricCar("Red", 2020, 50000);
console.log(eCar.color);console.log(eCar.model);console.log(eCar.battery);
eCar.beepSound();ماذا حدث؟
أنشأنا نموذجًا جديدًا باسم ElectricCar.
لكن بدلاً من كتابة خصائص السيارة ودوالها مرة أخرى، استخدمنا الكلمة المفتاحية:
extendsوهذا يعني أن ElectricCar يرث كل ما هو موجود داخل Car.
لذلك أصبح بإمكان الكائن الجديد استخدام:
colormodelbeepSound()
رغم أننا لم نكتبها داخل ElectricCar.
ما وظيفة super؟
قد تلاحظ أننا كتبنا داخل الـ Constructor:
super(color, model);تستدعي super() مُنشئ (Constructor) النموذج الأب (Parent Class) حتى يتم تهيئة الخصائص الموجودة فيه.
بعد ذلك أضفنا خاصية جديدة خاصة بالسيارة الكهربائية:
this.battery = battery;وهكذا أصبح الكائن يحتوي على جميع خصائص السيارة العادية بالإضافة إلى خاصية البطارية.
تعديل الدوال الموروثة
قد نحتاج أحيانًا إلى تعديل سلوك دالة موجودة في النموذج الأب، مع الاحتفاظ بوظيفتها الأصلية.
يمكننا فعل ذلك بإعادة تعريف (Override) الدالة داخل النموذج الابن.
class Car { constructor(color, model) { this.color = color; this.model = model; }
beepSound() { console.log("beeeeeeeeeep"); }}
class ElectricCar extends Car { constructor(color, model, battery) { super(color, model); this.battery = battery; }
beepSound() { super.beepSound(); console.log("beeeeeep with Electric"); }}لماذا استخدمنا super مرة أخرى؟
داخل الدالة:
super.beepSound();نطلب أولًا من JavaScript تنفيذ الدالة الأصلية الموجودة في Car.
بعد انتهاء تنفيذها، نضيف السلوك الجديد الخاص بـ ElectricCar.
وبذلك لم نستبدل وظيفة الأب بالكامل، بل أعدنا استخدامها ثم أضفنا إليها سلوكًا جديدًا.
ماذا يجب أن تتذكر؟
- Inheritance تسمح بإنشاء نموذج جديد اعتمادًا على نموذج موجود مسبقًا.
- تستخدم الكلمة المفتاحية
extendsلوراثة نموذج آخر. - تستدعي
super()مُنشئ النموذج الأب داخل الـ Constructor. - يمكن استخدام
super.methodName()لاستدعاء دوال النموذج الأب. - الوراثة تقلل تكرار الكود وتساعد على إعادة استخدامه بطريقة منظمة.