Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

حدود الوراثة العميقة

جزء من قسم البرمجة كائنية التوجه في رحلة 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. يمكن أن يؤدي ذلك إلى عدة مشكلات:

  1. قد تؤدي التغييرات التي تطرأ على Vehicle إلى تعطيل SportsCar بشكل غير متوقع
  1. كلما زادت سلسلة inheritance، أصبح من الصعب تتبّع مصدر methods وproperties
  1. تُجبَر على علاقات «is-a» التي قد لا تكون مرنة بما يكفي
challenge icon

التحدي

أكمل ملف Robot.js لجعل الروبوت يعمل. في الوقت الحالي، تم بناء الروبوت لكنه لا يستطيع فعل أي شيء.

ما يجب فعله في <strong>Robot.js</strong>:

  1. أنشئ مكوّني speaker و mover داخل مُنشئ Robot
  2. استخدم المكوّنين في الدالتين:
    1. في greet(): استدعِ this.speaker.speak("Hello!");
    2. في 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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم JavaScript عبر الإنترنت