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

أساسيات الوراثة

جزء من قسم Object Oriented Programming في رحلة Dart على Coddy — الدرس 36 من 110.

تسمح الوراثة للفئة باكتساب خصائص وأساليب فئة أخرى. فبدلاً من إعادة كتابة الكود نفسه، يمكنك إنشاء فئة جديدة تعتمد على فئة موجودة. تُسمى الفئة الأصلية الأب (أو superclass)، وتُسمى الفئة الجديدة الابن (أو subclass).

في لغة Dart، تستخدم الكلمة المفتاحية extends للوراثة من فئة أب (parent class):

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

void main() {
  var dog = Dog('Buddy');
  dog.eat();   // موروثة من Animal
  dog.bark();  // معرفة في Dog
}

تمتلك فئة Dog تلقائيًا إمكانية الوصول إلى خاصية name ودالة eat() من Animal، بالإضافة إلى دالة bark() الخاصة بها. ينشئ هذا علاقة "is-a" - فالـ Dog هو Animal.

يمكن للفئة الفرعية إضافة خصائص وطرق جديدة، لكنها ترث كل ما هو عام من الفئة الأصل. لاحظ أن الأعضاء الخاصين (أولئك الذين لديهم _) لا يمكن الوصول إليهم مباشرة في الفئات الفرعية من مكتبات مختلفة، على الرغم من أنهم لا يزالون موجودين في الكائن الموروث.

challenge icon

التحدي

سهل

دعنا نبني نظام مركبات يوضح كيف تسمح الوراثة للفئات الفرعية (child classes) بإعادة استخدام وتوسيع وظائف الفئة الأب (parent class). ستقوم بإنشاء فئة أب للمركبات العامة وفئة فرعية لنوع معين من المركبات.

ستقوم بتنظيم الكود الخاص بك في ملفين:

  • vehicle.dart: قم بتعريف الفئات الخاصة بك هنا:
    • فئة Vehicle (الأب) مع خاصية String brand، ومنشئ (constructor) يأخذ العلامة التجارية، ودالة start() تطبع [brand] engine starting...
    • فئة Motorcycle ترث من Vehicle. يجب أن تحتوي على خاصية إضافية int cc (سعة المحرك)، ومنشئ يأخذ كلاً من العلامة التجارية و cc (مع تمرير العلامة التجارية إلى الأب باستخدام super)، ودالة خاصة بها wheelie() تطبع [brand] is doing a wheelie!
  • main.dart: قم باستيراد ملف المركبة واستعرض الوراثة بشكل عملي:
    • أنشئ Vehicle بالعلامة التجارية 'Toyota'
    • استدعِ دالة start() الخاصة بها
    • أنشئ Motorcycle بالعلامة التجارية 'Harley' و cc بقيمة 1200
    • استدعِ دالة start() للدراجة النارية (الموروثة من Vehicle)
    • استدعِ دالة wheelie() للدراجة النارية (المعرفة في Motorcycle)
    • اطبع Motorcycle engine: [cc]cc لإظهار الخاصية الفريدة للفئة الفرعية

لاحظ كيف تحصل فئة Motorcycle تلقائياً على صلاحية الوصول إلى خاصية brand ودالة start() من Vehicle، بينما تمتلك أيضاً خاصية cc ودالة wheelie() الفريدتين بها. هذه هي قوة الوراثة - البناء على الكود الموجود مسبقاً.

المخرجات المتوقعة:

Toyota engine starting...
Harley engine starting...
Harley is doing a wheelie!
Motorcycle engine: 1200cc

ورقة مرجعية

استخدم الكلمة الأساسية extends لإنشاء فئة فرعية ترث من فئة أب:

class Animal {
  String name;
  
  Animal(this.name);
  
  void eat() {
    print('$name is eating');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void bark() {
    print('$name says woof!');
  }
}

ترث الفئة الفرعية جميع الخصائص والأساليب العامة من الفئة الأب. استخدم super في منشئ الفئة الفرعية لتمرير المعاملات إلى منشئ الفئة الأب.

يمكن للفئات الفرعية إضافة خصائصها وأساليبها الخاصة مع الاستمرار في الوصول إلى الخصائص والأساليب الموروثة:

var dog = Dog('Buddy');
dog.eat();   // موروث من Animal
dog.bark();  // معرف في Dog

يؤدي هذا إلى إنشاء علاقة "is-a" - فالكلب (Dog) هو حيوان (Animal).

جرّب بنفسك

import 'vehicle.dart';

void main() {
  // TODO: قم بإنشاء مركبة (Vehicle) بعلامة تجارية 'Toyota'
  
  // TODO: استدعِ دالة start() الخاصة بالمركبة
  
  // TODO: قم بإنشاء دراجة نارية (Motorcycle) بعلامة تجارية 'Harley' وسعة محرك 1200
  
  // TODO: استدعِ دالة start() الخاصة بالدراجة النارية (الموروثة من Vehicle)
  
  // TODO: استدعِ دالة wheelie() الخاصة بالدراجة النارية
  
  // TODO: اطبع 'Motorcycle engine: [cc]cc' باستخدام خاصية cc الخاصة بالدراجة النارية
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming