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

إعادة تعريف الدوال (Method Overriding)

جزء من قسم البرمجة كائنية التوجه في رحلة Dart على Coddy. الدرس 38 من 110.

يحدث تجاوز method عندما توفر فئة فرعية تطبيقها الخاص لـ method موجودة بالفعل في الفئة parent. يتيح ذلك للفئات الفرعية تخصيص السلوك الموروث مع الحفاظ على توقيع method نفسه.

عندما تعرّف method في class فرعية بالاسم والمعلمات نفسيهما كما في parent، تتولى نسخة الفئة الابنة المهمة:

class Animal {
  String name;
  
  Animal(this.name);
  
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  
  void speak() {
    print('$name barks: Woof!');
  }
}

void main() {
  var animal = Animal('Generic');
  var dog = Dog('Buddy');
  
  animal.speak();  // Generic يصدر صوتًا
  dog.speak();     // Buddy ينبح: Woof!
}

عندما تستدعي speak() على نسخة من Dog، ينفّذ Dart إصدار Dog، وليس إصدار Animal. لقد أجرت الفئة الابنة override لـ method الخاصة بـ parent.

يمكنك أيضًا الجمع بين إعادة التعريف وsuper لتوسيع سلوك parent بدلًا من استبداله:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speak() {
    super.speak();  // استدعِ نسخة الأب أولاً
    print('$name also purrs');
  }
}

يتيح لك هذا النمط البناء على الوظائف الحالية. القاعدة الأساسية بسيطة: يستبدل method بالاسم والمعلمات نفسيهما تنفيذ الفئة الأصلية عند استدعائه على مثيلات الفئة الفرعية.

challenge icon

التحدي

سهل

لنبنِ نظام إشعارات يوضّح كيف يمكن لـ child classes إجراء override لأساليب parent لتخصيص السلوك. ستنشئ أنواعًا مختلفة من الإشعارات، يسلّم كل منها الرسائل بطريقته الفريدة.

ستنظّم الكود في ملفين:

  • notification.dart: Define التسلسل الهرمي للإشعارات هنا:
    • class Notification (الـ parent) مع String title وString message. أدرج constructor يأخذ القيمتين وmethod send() يطبع Notification: [title] - [message]
    • class EmailNotification التي تمتد من Notification وتضيف خاصية String recipient. أجرِ override لـmethod send() ليطبع Sending email to [recipient]: [title] - [message]
    • class PushNotification التي تمتد من Notification وتضيف خاصية String deviceId. أجرِ override لـmethod send() لاستدعاء method الـparent أولًا باستخدام super، ثم طباعة Pushed to device: [deviceId] في السطر التالي
  • main.dart: استورد ملف الإشعارات الخاص بك ووضّح override للـmethod أثناء العمل:
    • أنشئ Notification أساسيًا بعنوان 'Alert' ورسالة 'System update available'
    • call لـmethod send() الخاص به
    • اطبع سطرًا فارغًا
    • أنشئ EmailNotification بعنوان 'Welcome'، ورسالة 'Thanks for signing up!'، وrecipient بقيمة 'user@example.com'
    • call لـmethod send() الخاص به
    • اطبع سطرًا فارغًا
    • أنشئ PushNotification بعنوان 'Reminder'، ورسالة 'Meeting in 10 minutes'، وdeviceId بقيمة 'DEVICE-001'
    • call لـmethod send() الخاص به

لاحظ كيف تستبدل EmailNotification سلوك الـparent بالكامل، بينما تمدّه PushNotification باستدعاء super.send() أولًا. كلا الأسلوبين طريقتان صحيحتان لإجراء override للـmethods وفقًا لاحتياجاتك.

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

Notification: Alert - System update available

Sending email to user@example.com: Welcome - Thanks for signing up!

Notification: Reminder - Meeting in 10 minutes
Pushed to device: DEVICE-001

جرّب بنفسك

import 'notification.dart';

void main() {
  // TODO: Create a base Notification with title 'Alert' and message 'System update available'
  // استدعِ method send() الخاص به

  // TODO: اطبع سطراً فارغاً

  // TODO: أنشئ EmailNotification مع:
  // - title: 'Welcome'
  // - message: 'Thanks for signing up!'
  // - recipient: 'user@example.com'
  // استدعِ method send() الخاص به

  // TODO: اطبع سطراً فارغاً

  // TODO: أنشئ PushNotification مع:
  // - title: 'Reminder'
  // - message: 'Meeting in 10 minutes'
  // - deviceId: 'DEVICE-001'
  // استدعِ method send() الخاص به
}
quiz iconاختبر نفسك

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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Dart عبر الإنترنت