حدود الوراثة العميقة
جزء من قسم البرمجة كائنية التوجه في رحلة JavaScript على Coddy. الدرس 48 من 56.
مع أن الوراثة مفيدة، فإن إنشاء تسلسلات هرمية عميقة جدًا من الوراثة (أب → ابن → حفيد → ابن الحفيد) قد يؤدي إلى مشكلات. كلما طال التسلسل، أصبح فهم الشيفرة وصيانتها وتعديلها أصعب.
لنرَ ما يحدث مع سلسلة وراثة عميقة:
// الفئة الأساسية
class Vehicle {
constructor(type) {
this.type = type;
this.isRunning = false;
}
start() {
this.isRunning = true;
console.log(`${this.type} started`);
}
}
// المستوى الأول من الوراثة
class Car extends Vehicle {
constructor(make, model) {
super("Car");
this.make = make;
this.model = model;
this.wheels = 4;
}
honk() {
console.log("Beep beep!");
}
}
// المستوى الثاني من الوراثة
class SportsCar extends Car {
constructor(make, model, topSpeed) {
super(make, model);
this.topSpeed = topSpeed;
}
race() {
this.start();
console.log(`Racing at ${this.topSpeed} mph!`);
}
}في هذا المثال، يقع SportsCar على عمق مستويين في التسلسل الوراثي. قد يؤدي هذا إلى عدة مشكلات:
- قد تؤدي التغييرات على Vehicle إلى تعطيل SportsCar بشكل غير متوقع
- كلما ازداد تسلسل الوراثة، أصبح من الأصعب تتبّع مصدر الأساليب والخصائص
- تُجبر على الدخول في علاقات «هو-نوع من» قد لا تكون مرنة بما يكفي
التحدي
أكمل ملف Robot.js لجعل الروبوت يعمل. الروبوت مُنشأ حاليًا، لكنه لا يستطيع فعل أي شيء.
ما يجب فعله في Robot.js:
- أنشئ مكوّني المتحدث والمحرّك داخل مُنشئ Robot
- استخدم المكوّنين في الأساليب:
- في
greet(): استدعِthis.speaker.speak("Hello!"); - في
walkForward(): استدعِthis.mover.move("forward");
- في
لماذا نفعل ذلك: هذا هو التركيب — يُبنى الروبوت بدمج مكوّنات أصغر. فالروبوت لديه متحدث (للتحدث) ولديه محرّك (للحركة)، بدلًا من أن يرث هاتين القدرتين.
جرّب بنفسك
import { Robot } from './Robot.js';
const myRobot = new Robot('Robo');
myRobot.greet(); // يجب أن يُخرج: Saying: "Hello!"
myRobot.walkForward(); // يجب أن يُخرج: Moving forwardيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الكائنات والكلمة المفتاحية this
مراجعة سريعة: الكائناتإضافة Methods إلى الكائناتفهم الكلمة المفتاحية thisConstructor Functionsالكلمة المفتاحية newتحدي المراجعة7الوراثة والكلمة المفتاحية extends
الوراثةعلاقة "is-a"الكلمة المفتاحية extendsالدالة super()وراثة الخصائص والوظائفتحدي المراجعة2تنظيم الكود
ما هي الـ Modules؟التصدير باستخدام exportالاستيراد باستخدام importالـ Default مقابل الـ Named Exports8تنظيم كود OOP
تنظيم الـ Classes في Modules11مشروع: مصيّر الأشكال
إعداد: فئة Shape والتصديروراثة فئة Circleإعادة التعريف ودالة المساحةعداد الأشكال Staticتدرّب بنفسك: مترجم JavaScript عبر الإنترنت