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

إنشاء Mixins

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

الآن بعد أن فهمت ما هي الـ mixins، دعنا نلقي نظرة على كيفية إنشائها بشكل صحيح. يتم التصريح عن الـ mixin باستخدام الكلمة المفتاحية mixin بدلاً من class.

mixin Logging {
  void log(String message) {
    print('[LOG] $message');
  }
  
  void logError(String error) {
    print('[ERROR] $error');
  }
}

يمكن أن تحتوي الـ Mixins على دوال (methods)، وخصائص (properties)، وحتى دوال جلب (getters) وتعيين (setters) - تماماً مثل الأصناف (classes). ومع ذلك، هناك قاعدة واحدة مهمة: لا يمكن للـ mixins أن تحتوي على دوال بناء (constructors). بما أن الـ mixins مخصصة ليتم "دمجها" بدلاً من إنشائها بشكل مباشر، فهي لا تحتاج إلى منطق تهيئة (initialization logic).

mixin Timestamped {
  DateTime createdAt = DateTime.now();
  
  String get formattedTime => createdAt.toString();
  
  void printTimestamp() {
    print('Created at: $formattedTime');
  }
}

class Document with Timestamped {
  String title;
  Document(this.title);
}

void main() {
  var doc = Document('Report');
  doc.printTimestamp();  // يستخدم دالة الـ mixin
  print(doc.createdAt);  // يستخدم خاصية الـ mixin
}

عندما تقوم بتطبيق mixin باستخدام with، تصبح جميع أعضائه جزءاً من فئتك (class). يمكن للفئة استخدامها مباشرة، وكذلك يمكن لأي كود لديه مثيل (instance) من تلك الفئة. هذا يجعل الـ mixins وسيلة نظيفة لإضافة وظائف قابلة لإعادة الاستخدام دون تعقيد تسلسلات الوراثة الهرمية.

challenge icon

التحدي

سهل

لنقم ببناء نظام مراسلة يوضح كيفية إنشاء mixins تحتوي على دوال (methods)، وخصائص (properties)، ومسترجعات (getters). ستقوم بتصميم mixin يضيف إمكانيات التنسيق لأنواع مختلفة من الرسائل.

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

  • messaging.dart: قم بتعريف الـ mixin وفئات الرسائل هنا:
    • mixin باسم Formattable يحتوي على:
      • خاصية String prefix مهيأة بالقيمة '>>>'
      • مسترجع (getter) باسم separator يعيد القيمة ' | '
      • دالة format(String text) تعيد السلسلة النصية [prefix][separator][text]
      • دالة formatBold(String text) تعيد **[text]**
    • فئة TextMessage تستخدم الـ mixin المسمى Formattable. أضف خاصية String sender مع منشئ (constructor). قم بتضمين دالة send(String content) تطبع نتيجة استدعاء format() مع [sender]: [content]
    • فئة AlertMessage تستخدم أيضاً الـ mixin المسمى Formattable. أضف خاصية String level مع منشئ. قم بتضمين دالة alert(String content) تطبع نتيجة استدعاء format() مع [[level]] [formatBold(content)]
  • main.dart: قم باستيراد ملف المراسلة الخاص بك ووضح كيف يكتسب كلا نوعي الرسائل إمكانيات التنسيق من الـ mixin:
    • أنشئ TextMessage مع مرسل 'Alice'
    • أنشئ AlertMessage مع مستوى 'WARNING'
    • استدعِ send('Hello there!') على رسالة النص
    • استدعِ alert('System overload') على رسالة التنبيه

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

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

>>> | Alice: Hello there!
>>> | [WARNING] **System overload**

جرّب بنفسك

import 'messaging.dart';

void main() {
  // TODO: أنشئ TextMessage مع المرسل 'Alice'
  
  // TODO: أنشئ AlertMessage مع المستوى 'WARNING'
  
  // TODO: استدعِ send('Hello there!') على الـ text message
  
  // TODO: استدعِ alert('System overload') على الـ alert message
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming