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

الكلمة المفتاحية on في Mixins

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

في بعض الأحيان، يحتاج الـ mixin إلى استخدام دوال (methods) أو خصائص (properties) من الفئة (class) التي يتم دمجه فيها. تتيح لك الكلمة المفتاحية on تقييد الـ mixin ليتم استخدامه فقط مع الفئات التي ترث من نوع معين.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // يمكن الوصول إلى 'name' من Animal
    breathe();  // يمكن استدعاء دوال Animal
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

يعني التصريح on Animal أن هذا الـ mixin لا يمكن تطبيقه إلا على الأصناف (classes) التي ترث من Animal. يضمن هذا وصول الـ mixin إلى أعضاء Animal. فبدون on، لن يعرف الـ mixin بوجود name أو breathe().

إذا حاولت استخدام mixin مقيد على class غير متوافق، فستعطيك Dart خطأ في وقت التصريف (compile-time error):

class Robot with Swimming {}  // خطأ! Robot لا يوسع Animal

هذا القيد مفيد عندما تعتمد وظائف الـ mixin الخاصة بك على إمكانيات محددة من فئة أساسية (base class). فهو ينشئ عقداً أكثر أماناً - حيث يَعِد الـ mixin بسلوك معين، ولكن فقط عندما يمتلك الأساس الذي يحتاجه للعمل بشكل صحيح.

challenge icon

التحدي

سهل

لنقم ببناء نظام مركبات يوضح كيف تقيد الكلمة الأساسية on الـ mixins للعمل فقط مع فئات أساسية محددة. ستقوم بإنشاء mixin يضيف وظيفة تعزيز التوربو (turbo boost)، ولكن لا يمكن استخدامه إلا من قبل الفئات التي ترث من الفئة الأساسية Vehicle.

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

  • vehicles.dart: قم بتعريف الفئة الأساسية، والـ mixin المقيد، وأنواع المركبات هنا:
    • فئة Vehicle مع خاصية String model وخاصية int speed. قم بتضمين منشئ (constructor) يأخذ كلتا القيمتين. أضف دالة accelerate() تطبع '$model accelerating to $speed km/h'
    • الـ mixin المسمى TurboBoost المقيد بـ Vehicle باستخدام الكلمة الأساسية on. يجب أن يحتوي هذا الـ mixin على دالة activateTurbo() تطبع '$model TURBO ACTIVATED!' ثم تستدعي accelerate() (كلاهما متاح بسبب قيد on Vehicle)
    • فئة SportsCar ترث من Vehicle وتستخدم الـ mixin المسمى TurboBoost. أضف خاصية String color. يجب أن يأخذ المنشئ model و speed و color. قم بتضمين دالة showOff() تطبع '$color $model ready to race!'
  • main.dart: قم باستيراد ملف المركبات الخاص بك ووضح كيف يعمل الـ mixin المقيد:
    • قم بإنشاء SportsCar مع model بقيمة 'Ferrari'، و speed بقيمة 320، و color بقيمة 'Red'
    • استدعِ showOff()
    • استدعِ activateTurbo()

يمكن للـ mixin المسمى TurboBoost الوصول إلى model واستدعاء accelerate() لأن إعلان on Vehicle يضمن أنه سيتم دمجه فقط في الفئات التي ترث من Vehicle. هذا ينشئ عقداً آمناً حيث يعرف الـ mixin تماماً ما هي الإمكانيات المتاحة.

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

Red Ferrari ready to race!
Ferrari TURBO ACTIVATED!
Ferrari accelerating to 320 km/h

ورقة مرجعية

تقيد الكلمة المفتاحية on الـ mixin ليتم استخدامه فقط مع الفئات (classes) التي ترث من نوع معين. يتيح ذلك للـ mixin الوصول بأمان إلى الدوال والخصائص من الفئة الأساسية.

class Animal {
  String name;
  Animal(this.name);
  
  void breathe() => print('$name is breathing');
}

mixin Swimming on Animal {
  void swim() {
    print('$name is swimming');  // Can access 'name' from Animal
    breathe();  // Can call Animal's methods
  }
}

class Fish extends Animal with Swimming {
  Fish(String name) : super(name);
}

يضمن التصريح on Animal وصول الـ mixin إلى أعضاء Animal. بدون ذلك، لن يعرف الـ mixin بوجود name أو breathe().

تؤدي محاولة استخدام mixin مقيد على فئة غير متوافقة إلى حدوث خطأ في وقت التجميع (compile-time error):

class Robot with Swimming {}  // Error! Robot doesn't extend Animal

هذا القيد مفيد عندما تعتمد وظائف الـ mixin الخاص بك على قدرات محددة من فئة أساسية، مما يؤدي إلى إنشاء عقد أكثر أماناً بين الـ mixin والفئات التي تستخدمه.

جرّب بنفسك

import 'vehicles.dart';

void main() {
  // TODO: أنشئ SportsCar بطراز 'Ferrari'، وسرعة 320، ولون 'Red'
  
  // TODO: استدعِ showOff()
  
  // TODO: استدعِ activateTurbo()
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming