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

استخدام Mixins متعددة

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

تماماً كما يمكنك تنفيذ واجهات متعددة، يمكنك أيضاً تطبيق عدة mixins على فئة واحدة. ببساطة، قم بإدراجها بعد الكلمة المفتاحية with، مفصولة بفواصل.

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

mixin Walking {
  void walk() => print('Walking');
}

class Duck with Swimming, Flying, Walking {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // من Swimming mixin
  duck.fly();    // من Flying mixin
  duck.walk();   // من Walking mixin
  duck.quack();  // من Duck class
}

ترتيب الـ mixins مهم عندما تحتوي على methods بنفس الاسم. آخر mixin في القائمة هو الذي يسود:

mixin A {
  void greet() => print('Hello from A');
}

mixin B {
  void greet() => print('Hello from B');
}

class MyClass with A, B {}

void main() {
  MyClass().greet();  // المخرجات: Hello from B
}

بما أن B يأتي بعد A، فإن الدالة greet() الخاصة به لها الأولوية. يتيح لك سلوك الطبقات هذا تكوين الأصناف بالقدرات التي تحتاجها تماماً، ودمج الوظائف من مصادر متعددة دون تسلسلات هرمية معقدة للوراثة.

challenge icon

التحدي

سهل

لنقم ببناء نظام أجهزة منزلية ذكية يجمع بين إمكانيات متعددة من خلال الـ mixins. ستقوم بإنشاء mixins مختلفة تمثل ميزات ذكية متنوعة، ثم بناء جهاز يستخدمها جميعاً معاً.

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

  • smart_features.dart: قم بتعريف ثلاثة mixins توفر إمكانيات مختلفة للمنزل الذكي:
    • mixin باسم VoiceControl يحتوي على دالة voiceCommand(String command) تقوم بطباعة Voice: [command]
    • mixin باسم WiFiEnabled يحتوي على دالة connectWiFi(String network) تقوم بطباعة Connected to [network]
    • mixin باسم PowerSaver يحتوي على دالة enterSleepMode() تقوم بطباعة Entering sleep mode... ودالة wakeUp() تقوم بطباعة Waking up!
    ثم قم بإنشاء كلاس SmartSpeaker يستخدم الـ mixins الثلاثة جميعاً. أضف خاصية String name مع constructor، وقم بتضمين دالة playMusic(String song) تقوم بطباعة [name] playing: [song]
  • main.dart: قم باستيراد ملف الميزات الذكية الخاص بك واستعرض كيف يجمع مكبر الصوت بين جميع الإمكانيات:
    • قم بإنشاء SmartSpeaker باسم 'Echo'
    • استدعِ connectWiFi('HomeNetwork')
    • استدعِ voiceCommand('Play jazz')
    • استدعِ playMusic('Smooth Jazz Mix')
    • استدعِ enterSleepMode()
    • استدعِ wakeUp()

يكتسب SmartSpeaker الخاص بك دوالاً من الـ mixins الثلاثة جميعاً باستخدام جملة with واحدة، مما يوضح كيف تسمح لك الـ mixins المتعددة بتكوين الإمكانيات التي تحتاجها بالضبط دون الحاجة إلى وراثة معقدة.

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

Connected to HomeNetwork
Voice: Play jazz
Echo playing: Smooth Jazz Mix
Entering sleep mode...
Waking up!

ورقة مرجعية

يمكن للفئة (class) تطبيق عدة mixins من خلال إدراجها بعد الكلمة المفتاحية with، مفصولة بفواصل:

mixin Swimming {
  void swim() => print('Swimming');
}

mixin Flying {
  void fly() => print('Flying');
}

class Duck with Swimming, Flying {
  void quack() => print('Quack!');
}

void main() {
  var duck = Duck();
  duck.swim();   // من Swimming mixin
  duck.fly();    // من Flying mixin
  duck.quack();  // من Duck class
}

عندما تحتوي عدة mixins على دوال بنفس الاسم، فإن الـ mixin الأخير في القائمة تكون له الأولوية:

mixin A {
  void greet() => print('Hello from A');
}

mixin B {
  void greet() => print('Hello from B');
}

class MyClass with A, B {}

void main() {
  MyClass().greet();  // المخرجات: Hello from B
}

جرّب بنفسك

import 'smart_features.dart';

void main() {
  // TODO: أنشئ SmartSpeaker باسم 'Echo'
  
  // TODO: استدعِ connectWiFi('HomeNetwork')
  
  // TODO: استدعِ voiceCommand('Play jazz')
  
  // TODO: استدعِ playMusic('Smooth Jazz Mix')
  
  // TODO: استدعِ enterSleepMode()
  
  // TODO: استدعِ wakeUp()
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming