ما هو تعدد الأشكال؟
جزء من قسم 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()، ولكن كل منها يفعل ذلك بطريقته الخاصة.
التحدي
لديك نظام إشعارات يحتوي على فئة أب Notification وفئتين ابنتين. مهمتك هي إضافة الطريقة send(message) إلى كل فئة ابنة بتنفيذات مختلفة.
- في الفئة
EmailNotification، يجب أن تعيد الطريقة السلسلة النصية: "Sending '(message)' via Email" - في الفئة
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1الكائنات والكلمة المفتاحية this
مراجعة سريعة: الكائناتإضافة Methods إلى الكائناتفهم الكلمة المفتاحية thisConstructor Functionsالكلمة المفتاحية newتحدي المراجعة7الوراثة والكلمة المفتاحية extends
الوراثةعلاقة "is-a"الكلمة المفتاحية extendsالدالة super()وراثة الخصائص والوظائفتحدي المراجعة2تنظيم الكود
ما هي الـ Modules؟التصدير باستخدام exportالاستيراد باستخدام importالـ Default مقابل الـ Named Exports8تنظيم كود OOP
تنظيم الـ Classes في Modules11مشروع: مصيّر الأشكال
إعداد: فئة Shape والتصديروراثة فئة Circle