استخدام 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() الخاصة به لها الأولوية. يتيح لك سلوك الطبقات هذا تكوين الأصناف بالقدرات التي تحتاجها تماماً، ودمج الوظائف من مصادر متعددة دون تسلسلات هرمية معقدة للوراثة.
التحدي
سهللنقم ببناء نظام أجهزة منزلية ذكية يجمع بين إمكانيات متعددة من خلال الـ 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]- mixin باسم
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()
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات الـ OOP
الملفات الخارجيةالمكتبات والـ Importsمقدمة في الـ OOPالـ Classes مقابل الـ Objectsالكلمة المفتاحية thisالـ Methodsمتغيرات الـ Instanceأساسيات الـ Constructorمراجعة - آلة حاسبة بسيطة4أمان الـ Null
مقدمة في أمان الـ NullNullable مقابل Non-Nullableعاملا الـ ? و !الكلمة المفتاحية Late وأمان الـ Nullالعوامل المدركة للـ Nullأمان الـ Null في الـ Classesمراجعة - نظام ملف تعريف المستخدم7الفئات المجردة والواجهات
الفئات المجردةالدوال المجردةالواجهات في Dartالواجهات الضمنيةالتنفيذ مقابل التوسيعالواجهات المتعددةمراجعة - حاسبة الأشكال10المجموعات والأنماط العامة
نظرة عامة على List و Set و Mapالمجموعات آمنة النوعالفئات العامةالدوال العامةقيود الأنماط العامةIterable و Iteratorملخص - التخزين العام13مفاهيم OOP المتقدمة
التركيب مقابل الوراثة (Composition vs Inheritance)دوال التوسعة (Extension Methods)الأصناف القابلة للاستدعاء (Callable Classes)الأصناف المختومة (Sealed Classes - Dart 3)السجلات (Records - Dart 3)الأنماط والمطابقة (Patterns & Matching - 3.0)التعدادات مع الدوال (Enums with Methods)2المنشئات في Dart
المنشئ الافتراضيالمنشئات المسماةقوائم التهيئةالمنشئات الثابتةالمنشئات المصنعيةالمنشئات الموجهةملخص - بناء الأشكال5التغليف (Encapsulation)
الأعضاء العامة مقابل الخاصةاتفاقية البادئة _الخصوصية على مستوى المكتبةتعمق في Getters و Settersإخفاء المعلوماتمراجعة - سجلات الطلاب8Mixins
مقدمة إلى Mixinsإنشاء Mixinsاستخدام Mixins متعددةالكلمة المفتاحية on في MixinsMixin مقابل الوراثة (Inheritance)Mixin مقابل الواجهة (Interface)مراجعة - نظام الحيوانات (Animal System)3خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticحقول Final و Constمتغيرات Lateالـ Static Methods والحقولدوال الـ Getters والـ Settersمراجعة - مدير الحساب البنكي6الوراثة
أساسيات الوراثةالكلمة المفتاحية superإعادة تعريف الدوال (Method Overriding)الوسم @overrideالكلمة المفتاحية final Classالدوال البانية والوراثةمراجعة - هيكلية الموظفين9تعدد الأشكال
أساسيات تعدد الأشكالتعدد الأشكال عبر الـ Interfacesالتحقق من النوع أثناء التشغيلالمعاملات is و asالكلمة المفتاحية Covariantملخص - معالج الدفع12البرمجة الكائنية غير المتزامنة (Async OOP)
Futures و async/awaitأساسيات الـ Streamsمتحكمات الـ Streamsالـ Constructors غير المتزامنةالعمليات غير المتزامنة في دوال الكلاسمراجعة - جالب البيانات (Data Fetcher)15أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع