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

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

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

  1. قد تؤدي التغييرات في Vehicle إلى كسر SportsCar بشكل غير متوقع
  1. مع نمو سلسلة الوراثة، يصبح من الصعب تتبع مصدر الأساليب والخصائص
  1. تُجبر على علاقات "is-a" قد لا تكون مرنة بما يكفي
challenge icon

التحدي

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

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

  1. أنشئ مكونات speaker و mover داخل constructor الروبوت
  2. استخدم المكونات في الدوال (methods):
    1. في greet(): استدعِ this.speaker.speak("Hello!");
    2. في walkForward(): استدعِ this.mover.move("forward");

لماذا نفعل هذا: هذا ما يسمى التركيب (composition) - حيث يتم بناء الروبوت من خلال دمج مكونات أصغر. الروبوت لديه (has-a) مكبر صوت (للتحدث) و لديه (has-a) محرك (للحركة)، بدلاً من وراثة هذه القدرات.

جرّب بنفسك

import { Robot } from './Robot.js';

const myRobot = new Robot('Robo');

myRobot.greet();     // يجب أن تكون النتيجة: Saying: "Hello!"
myRobot.walkForward(); // يجب أن تكون النتيجة: Moving forward
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming

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