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

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

جزء من قسم Object Oriented Programming في رحلة JavaScript على Coddy — الدرس 35 من 56.

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

في JavaScript، يظهر تعدد الأشكال (polymorphism) بشكل شائع عندما تقوم الفئات الفرعية (child classes) بإعادة تعريف (override) الدوال من الفئات الأب (parent classes).

لنقم بإنشاء فئة أب (parent class) بسيطة تحتوي على طريقة speak():

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    return `${this.name} makes a sound`;
  }
}

الآن، لنقم بإنشاء فئة فرعية (child class) ترث من Animal:

class Dog extends Animal {
  speak() {
    return `${this.name} barks`;
  }
}

إليك فئة تابعة أخرى:

class Cat extends Animal {
  speak() {
    return `${this.name} meows`;
  }
}

تقوم كل فئة فرعية بتنفيذ الدالة speak() بشكل مختلف. هذا هو تعدد الأشكال (polymorphism) قيد التنفيذ!

يمكننا الآن إنشاء كائنات مختلفة واستدعاء نفس الطريقة على كل منها:

const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");

console.log(animal.speak()); // يصدر الحيوان صوتاً
console.log(dog.speak());    // ريكس ينبح
console.log(cat.speak());    // ويسكرز يموء

تستجيب الكائنات الثلاثة جميعها للأسلوب speak()، ولكن كل منها يفعل ذلك بطريقته الخاصة.

challenge icon

التحدي

لديك نظام إشعارات يحتوي على فئة أب Notification وفئتين ابنتين. مهمتك هي إضافة الطريقة send(message) إلى كل فئة ابنة بتنفيذات مختلفة.

  1. في الفئة EmailNotification، يجب أن تعيد الطريقة السلسلة النصية: "Sending '(message)' via Email"
  2. في الفئة SMSNotification، يجب أن تعيد الطريقة السلسلة النصية: "Sending '(message)' via SMS"

ورقة مرجعية

يسمح تعدد الأشكال (Polymorphism) للكائنات من فئات مختلفة بالاستجابة لنفس الطريقة (method) بطرق مختلفة. في JavaScript، يتم تحقيق ذلك عادةً عندما تقوم الفئات الفرعية (child classes) بتجاوز الطرق الموروثة من الفئات الأب (parent classes).

قم بإنشاء فئة أب (parent class) تحتوي على طريقة:

class Animal {
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    return `${this.name} makes a sound`;
  }
}

يمكن للفئات الفرعية تجاوز طريقة الأب بتنفيذها الخاص:

class Dog extends Animal {
  speak() {
    return `${this.name} barks`;
  }
}

class Cat extends Animal {
  speak() {
    return `${this.name} meows`;
  }
}

يستجيب كل كائن لنفس الطريقة بشكل مختلف:

const animal = new Animal("Some animal");
const dog = new Dog("Rex");
const cat = new Cat("Whiskers");

console.log(animal.speak()); // Some animal makes a sound
console.log(dog.speak());    // Rex barks
console.log(cat.speak());    // Whiskers meows

جرّب بنفسك

import { EmailNotification } from './email-notification.js';
import { SMSNotification } from './sms-notification.js';

// كود الاختبار - لا تقم بالتعديل
const email = new EmailNotification();
const sms = new SMSNotification();

console.log(email.send("Hello!"));  // يجب أن يستخدم send() الخاصة بـ EmailNotification
console.log(sms.send("Hello!"));    // يجب أن يستخدم send() الخاصة بـ SMSNotification
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming