ما هو تعدد الأشكال؟

تعدد الأشكال (Polymorphism) هو أحد المبادئ الأساسية في البرمجة كائنية التوجه، ويعتمد بشكل مباشر على الوراثة (Inheritance).

فكرته بسيطة:

يمكن للنموذج الابن أن يرث دالة من النموذج الأب، ثم يعيد تعريفها بالكامل لتناسب احتياجاته.

بمعنى آخر، يحتفظ باسم الدالة نفسه، لكن يغير طريقة تنفيذها.

مثال

لنستخدم المثال نفسه من الدرس السابق.

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() {
console.log("beeeeeep with Electric");
}
}
const eCar = new ElectricCar("Red", 2020, 50000);
console.log(eCar.color);
console.log(eCar.model);
console.log(eCar.battery);
eCar.beepSound();

ما الفرق عن الدرس السابق؟

في درس الوراثة كتبنا:

super.beepSound();
console.log("beeeeeep with Electric");

أي أننا نفذنا دالة الأب أولًا، ثم أضفنا سلوكًا جديدًا.

أما في هذا الدرس فقد حذفنا:

super.beepSound();

وأعدنا كتابة الدالة بالكامل.

وبذلك أصبحت ElectricCar تمتلك تنفيذًا مختلفًا للدالة beepSound()، رغم أن اسم الدالة لم يتغير.

ما هو الـ Override؟

عندما تكتب دالة داخل النموذج الابن تحمل الاسم نفسه الموجود في النموذج الأب، فإن الدالة الجديدة تحل محل الدالة الأصلية عند استدعائها من الكائن.

تُسمى هذه العملية:

Method Overriding

وهي أحد أشهر تطبيقات Polymorphism.

لماذا نستخدم تعدد الأشكال؟

يسمح لنا تعدد الأشكال بالحفاظ على واجهة استخدام واحدة، مع تغيير طريقة التنفيذ حسب نوع الكائن.

فقد تمتلك جميع السيارات دالة باسم beepSound()، لكن كل نوع من السيارات يمكنه تنفيذها بطريقة مختلفة.

وهذا يجعل الكود أكثر مرونة وأسهل في التوسعة مستقبلًا.

ماذا يجب أن تتذكر؟

  • Polymorphism يعتمد على Inheritance.
  • يمكن للنموذج الابن إعادة تعريف (Override) أي دالة يرثها من النموذج الأب.
  • عند تنفيذ Override، تُستخدم دالة الابن بدلًا من دالة الأب.
  • إذا أردت تنفيذ دالة الأب أيضًا، فاستخدم super.methodName().
  • يسمح تعدد الأشكال للكائنات المختلفة بتنفيذ السلوك نفسه بطرق مختلفة.