حدود الوراثة العميقة
جزء من قسم البرمجة كائنية التوجه في رحلة JavaScript على Coddy. الدرس 48 من 56.
على الرغم من أن inheritance مفيدة، فإن إنشاء تسلسلات هرمية عميقة جدًا من inheritance (الأصل → الابن → الحفيد → حفيد الحفيد) قد يؤدي إلى مشكلات. كلما ازداد عمق السلسلة، أصبح فهم الكود وصيانته وتعديله أكثر صعوبة.
لنرَ ما يحدث مع سلسلة توريث عميقة:
// الفئة الأساسية
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 على مستويين في عمق inheritance. يمكن أن يؤدي ذلك إلى عدة مشكلات:
- قد تؤدي التغييرات التي تطرأ على Vehicle إلى تعطيل SportsCar بشكل غير متوقع
- كلما زادت سلسلة inheritance، أصبح من الصعب تتبّع مصدر methods وproperties
- تُجبَر على علاقات «is-a» التي قد لا تكون مرنة بما يكفي
التحدي
أكمل ملف Robot.js لجعل الروبوت يعمل. في الوقت الحالي، تم بناء الروبوت لكنه لا يستطيع فعل أي شيء.
ما يجب فعله في <strong>Robot.js</strong>:
- أنشئ مكوّني speaker و mover داخل مُنشئ Robot
- استخدم المكوّنين في الدالتين:
- في
greet(): استدعِthis.speaker.speak("Hello!"); - في
walkForward(): استدعِthis.mover.move("forward");
- في
سبب فعل ذلك: هذا هو composition — يُبنى الروبوت من خلال دمج مكوّنات أصغر. يمتلك الروبوت has-a speaker (للتحدث) وhas-a mover (للحركة)، بدلًا من توريث هذه القدرات.
جرّب بنفسك
import { Robot } from './Robot.js';
const myRobot = new Robot('Robo');
myRobot.greet(); // يجب أن يُخرج: Saying: "Hello!"
myRobot.walkForward(); // Should output: 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 عبر الإنترنت