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

الواجهات المتعددة

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

واحدة من أكبر مزايا الواجهات (interfaces) مقارنة بالوراثة (inheritance) هي أن الفئة (class) يمكنها تنفيذ واجهات متعددة. بينما يقيدك Dart بتوسيع فئة واحدة فقط، يمكنك تنفيذ أي عدد تحتاجه من الواجهات.

abstract class Printable {
  void printContent();
}

abstract class Saveable {
  void save();
}

abstract class Shareable {
  void share(String recipient);
}

class Document implements Printable, Saveable, Shareable {
  String content;
  
  Document(this.content);
  
  @override
  void printContent() {
    print('Printing: $content');
  }
  
  @override
  void save() {
    print('Saving document...');
  }
  
  @override
  void share(String recipient) {
    print('Sharing with $recipient');
  }
}

عند تنفيذ واجهات متعددة، يجب عليك توفير تنفيذات لجميع الأساليب (methods) من كل واجهة. يجب أن يفي الصنف (class) بجميع العقود التي يلتزم بدعمها.

يمكنك أيضاً دمج extends مع عدة implements:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // لا يزال يتعين عليك تنفيذ جميع دوال الواجهة
  // (موروثة بالفعل من Document في هذه الحالة)
}

تتيح لك هذه المرونة تصميم فئات تناسب أدواراً متعددة. يمكن لـ SmartPhone تنفيذ واجهات Camera و Phone و MusicPlayer، مما يضمن قدرته على القيام بكل ما تتطلبه كل واجهة مع الحفاظ على تنفيذه الفريد الخاص.

challenge icon

التحدي

سهل

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

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

  • devices.dart: حدد الواجهات والفئة المنفذة هنا:
    • فئة Connectable مع دالة connect() تطبع Connecting to network...
    • فئة Chargeable مع دالة charge() تطبع Charging battery...
    • فئة Displayable مع دالة showScreen(String content) تطبع Displaying: [content]
    • فئة Tablet تنفذ الواجهات الثلاث: Connectable، و Chargeable، و Displayable. أضف خاصية String brand مع منشئ (constructor). يجب أن تطبع تنفيذاتك [brand] tablet connecting to WiFi للدالة connect، و [brand] tablet charging via USB-C للدالة charge، و [brand] screen: [content] للدالة showScreen
  • main.dart: استورد ملف الأجهزة ووضح كيف تلبي فئة Tablet جميع عقود الواجهات الثلاثة:
    • أنشئ Tablet بماركة 'Galaxy'
    • استدعِ connect()
    • استدعِ charge()
    • استدعِ showScreen('Welcome Home')

يجب أن توفر فئة Tablet تنفيذًا خاصًا بها لكل دالة من الواجهات الثلاث. يوضح هذا كيف يسمح تنفيذ واجهات متعددة لفئة واحدة بالوعد بقدرات متعددة مع الحفاظ على تفرد كل تنفيذ للجهاز.

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

Galaxy tablet connecting to WiFi
Galaxy tablet charging via USB-C
Galaxy screen: Welcome Home

ورقة مرجعية

يمكن للفئة تنفيذ **واجهات متعددة** عبر إدراجها بعد الكلمة المفتاحية implements، مفصولة بفاصلة:

abstract class Printable {
  void printContent();
}

abstract class Saveable {
  void save();
}

class Document implements Printable, Saveable {
  @override
  void printContent() {
    print('Printing...');
  }
  
  @override
  void save() {
    print('Saving...');
  }
}

عند تنفيذ واجهات متعددة، يجب عليك توفير تنفيذات لـ **جميع الدوال (methods) من كل واجهة**.

يمكنك الجمع بين extends و implements المتعددة:

class Report extends Document implements Printable, Shareable {
  Report(String content) : super(content);
  
  // Must implement all interface methods
}

يتيح ذلك للفئة الوفاء بعقود متعددة والقيام بأدوار متعددة في وقت واحد.

جرّب بنفسك

import 'devices.dart';

void main() {
  // TODO: أنشئ Tablet بماركة 'Galaxy'
  
  // TODO: استدعِ connect()
  
  // TODO: استدعِ charge()
  
  // TODO: استدعِ showScreen('Welcome Home')
  
}
quiz iconاختبر نفسك

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

جميع دروس Object Oriented Programming