وراثة الأصناف (Class Inheritance) في جافاسكربت: مفهومها وتطبيقاتها
وراثة الأصناف (Class Inheritance) هي أحد المفاهيم الأساسية في البرمجة الكائنية التوجه (OOP) التي تتيح لك استخدام فئات (Classes) لتمثيل الكائنات وتنظيم الكود بطريقة مرنة وقابلة لإعادة الاستخدام. في جافاسكربت، تأتي هذه الميزة لتقديم مفهوم البرمجة الكائنية التوجه بشكل مبسط من خلال استخدام الأصناف والفئات (Classes) التي يمكن أن ترث الخصائص والأساليب (Methods) من أصناف أخرى.
قبل أن نتعمق في وراثة الأصناف في جافاسكربت، من المهم أن نفهم بعض المفاهيم الأساسية التي تعد ضرورية لفهم هذه الميزة بشكل جيد. هذه المفاهيم تتضمن ما يلي:
-
الفئة (Class): هي قالب أو نموذج لإنشاء الكائنات (Objects)، حيث تحتوي الفئة على خصائص (Properties) وأساليب (Methods) مشتركة بين الكائنات التي يتم إنشاؤها باستخدام هذه الفئة.
-
الكائن (Object): هو تمثيل حي لفئة معينة، يمكن أن يحتوي على خصائص معينة وأساليب تخص هذا الكائن فقط.
-
الوراثة (Inheritance): هي الآلية التي تتيح لك استخدام فئة موجودة كأساس لإنشاء فئة جديدة، مما يسمح لها بالاحتفاظ بالخصائص والأساليب من الفئة الأصلية.
ما هي الوراثة في جافاسكربت؟
الوراثة في جافاسكربت هي القدرة على بناء فئة جديدة (subclass) تعتمد على فئة موجودة بالفعل (superclass)، حيث يمكن للفئة الفرعية (subclass) أن ترث الخصائص والأساليب من الفئة الأصلية (superclass). وبذلك، توفر الوراثة طريقة لتوسيع سلوك الكائنات الحالية دون الحاجة إلى إعادة كتابة الكود من البداية. على سبيل المثال، إذا كان لدينا فئة تمثل “حيوانات” تحتوي على أسلوب “التحدث”، يمكننا إنشاء فئة جديدة تمثل “القطط” التي ترث الأسلوب “التحدث” وتضيف أساليب أخرى مثل “المواء”.
كيفية تنفيذ الوراثة باستخدام الأصناف في جافاسكربت
في جافاسكربت، تتم الوراثة من خلال الكلمة المفتاحية extends التي تتيح للفئة الفرعية (subclass) أن ترث من الفئة الأصلية (superclass). يُمكنك تعريف الأصناف داخل جافاسكربت باستخدام الكلمة المفتاحية class، ومن ثم استخدام extends لإنشاء وراثة بين الفئات.
بنية وراثة الأصناف في جافاسكربت
1. تعريف الفئة الأصلية (Superclass)
الفئة الأصلية هي الفئة التي تحتوي على الخصائص والأساليب المشتركة التي ترغب في توريثها. هذا هو الجزء الأساسي في تصميم البرمجيات باستخدام البرمجة الكائنية التوجه. إليك مثالًا بسيطًا على تعريف فئة أصلية تسمى “Animal”:
javascriptclass Animal {
constructor(name, age) {
this.name = name;
this.age = age;
}
speak() {
console.log(`${this.name} makes a sound`);
}
}
في هذا المثال، تحتوي الفئة Animal على خصائص name و age، بالإضافة إلى أسلوب speak() الذي يمكن أن يتم وراثته في الفئات الأخرى.
2. إنشاء فئة فرعية (Subclass)
الفئة الفرعية هي فئة جديدة ترث الخصائص والأساليب من الفئة الأصلية. باستخدام الكلمة المفتاحية extends، يمكننا إنشاء فئة فرعية تسمى “Dog” ترث من الفئة “Animal”. هذه الفئة الفرعية يمكنها استخدام الأساليب والخصائص الموجودة في الفئة الأصلية، ويمكنها أيضًا إضافة خصائص وأساليب جديدة.
javascriptclass Dog extends Animal {
constructor(name, age, breed) {
super(name, age); // استدعاء مُنشئ الفئة الأصلية
this.breed = breed;
}
speak() {
console.log(`${this.name} barks`);
}
}
في هذا المثال، تقوم فئة Dog بالوراثة من Animal. تستخدم الكلمة المفتاحية super لاستدعاء مُنشئ الفئة الأصلية (constructor) من الفئة “Animal”، حيث يتم تمرير القيم المطلوبة (الاسم والعمر). ثم يمكن إضافة خصائص وأساليب جديدة لفئة Dog، مثل خاصية breed والأسلوب المعدل speak().
3. استخدام الفئة الفرعية
الآن، يمكننا إنشاء كائنات من الفئة الفرعية Dog واستخدام الخصائص والأساليب الموروثة من الفئة الأصلية، بالإضافة إلى الأساليب المضافة:
javascriptconst myDog = new Dog("Buddy", 3, "Golden Retriever");
console.log(myDog.name); // "Buddy"
console.log(myDog.age); // 3
console.log(myDog.breed); // "Golden Retriever"
myDog.speak(); // "Buddy barks"
فهم مفهوم super في جافاسكربت
الكلمة المفتاحية super هي أداة أساسية في جافاسكربت عند التعامل مع الوراثة. يتم استخدامها لاستدعاء مُنشئ الفئة الأصلية (superclass) داخل المُنشئ للفئة الفرعية (subclass) أو لاستدعاء الأساليب الموروثة من الفئة الأصلية.
في المثال السابق، استدعينا super(name, age) في مُنشئ الفئة الفرعية Dog لضمان توريث الخصائص من الفئة الأصلية Animal. بدون استخدام super، لن تتمكن الفئة الفرعية من الوصول إلى مُنشئ الفئة الأصلية.
الوراثة متعددة المستويات
في جافاسكربت، يمكن للفئة الفرعية أن ترث من فئة أخرى، مما يتيح إنشاء تسلسل هرمي من الفئات. على سبيل المثال، إذا كان لديك فئة Animal وفئة فرعية Dog، يمكن لفئة أخرى مثل GoldenRetriever أن ترث من Dog:
javascriptclass GoldenRetriever extends Dog {
constructor(name, age, color) {
super(name, age, "Golden Retriever");
this.color = color;
}
describe() {
console.log(`${this.name} is a ${this.color} ${this.breed}`);
}
}
const myGolden = new GoldenRetriever("Max", 5, "golden");
myGolden.describe(); // "Max is a golden Golden Retriever"
هنا، GoldenRetriever ترث من Dog، مما يعني أنها ترث الخصائص والأساليب من Dog (التي بدورها ترث من Animal).
التعدد في الأساليب الموروثة
من المزايا الرئيسية للوراثة في جافاسكربت هو التعدد في الأساليب. يسمح لك بتخصيص سلوك الكائنات دون التأثير على الكود الأساسي للفئة الأصلية. على سبيل المثال، يمكننا تعديل أسلوب speak في الفئة الفرعية ليؤدي سلوكًا مختلفًا:
javascriptclass Cat extends Animal {
speak() {
console.log(`${this.name} meows`);
}
}
const myCat = new Cat("Whiskers", 2);
myCat.speak(); // "Whiskers meows"
كما ترى، لقد قمنا بتخصيص الأسلوب speak() في الفئة الفرعية Cat دون التأثير على الأسلوب speak() في الفئة الأصلية Animal.
فوائد الوراثة في جافاسكربت
-
إعادة الاستخدام: الوراثة تتيح لك استخدام الكود المكرر في فئات مختلفة، مما يقلل من تكرار الكود ويزيد من كفاءته.
-
التوسع والتخصيص: يمكن أن تتمكن من إضافة خصائص أو أساليب جديدة في الفئات الفرعية دون الحاجة إلى تعديل الفئات الأصلية.
-
تنظيم الكود: باستخدام الوراثة، يمكنك تنظيم الكود بطريقة تجعل من السهل فهمه وصيانته.
ملاحظات ختامية
الوراثة في جافاسكربت تعد من الأدوات القوية التي توفرها البرمجة الكائنية التوجه. من خلال استخدام الفئات والأصناف مع مفهوم الوراثة، يمكنك كتابة كود منظم وقابل للتوسيع بسهولة. على الرغم من أن الوراثة توفر العديد من الفوائد، إلا أن الاستخدام المفرط لها يمكن أن يؤدي إلى تعقيد الكود وصعوبة فهمه، خاصة في المشاريع الكبيرة.

