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

الوسم @override

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

تُعدّ التعليمة التوضيحية @override علامةً من أفضل الممارسات تُخبر Dart (والمطورين الآخرين) بأنك تستبدل عمدًا method من الفئة parent. رغم أن تجاوز method يعمل من دونها، فإن استخدام @override يضيف طبقة أمان مهمة.

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

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

يوفر annotation فائدتين أساسيتين. first، يوثّق نيتك بوضوح - فأي شخص يقرأ الكود يعرف فورًا أن هذا method موجود في parent class. ثانيًا، سيحذّرك محلل Dart إذا كان method الخاص بـ parent غير موجود فعليًا، مما يساعد على اكتشاف الأخطاء المطبعية وأخطاء إعادة الهيكلة مبكرًا.

تخيّل ما يحدث إذا أخطأت في تهجئة اسم method من دون @override:

class Cat extends Animal {
  Cat(String name) : super(name);
  
  void speek() {  // خطأ إملائي! لا يوجد تحذير بدون @override
    print('$name meows');
  }
}

من دون annotation، يفترض Dart أنك تنشئ method جديدة تُسمى speek(). باستخدام @override، سيشير المحلل فورًا إلى عدم وجود method كهذه في parent class. تمنع هذه annotation البسيطة حدوث أخطاء دقيقة قد يصعب تعقّبها لاحقًا.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لمشغّل وسائط يوضّح أهمية التعليق التوضيحي @override عند تخصيص السلوك الموروث. ستنشئ أنواعًا مختلفة من الوسائط، بحيث يشغّل كلٌّ منها المحتوى بطريقته الخاصة.

ستنظّم الشيفرة في ملفين:

  • media.dart: عرّف تسلسل وسائطك الهرمي هنا:
    • فئة Media مع خاصية String title، وباني يتلقى العنوان، وmethod play() تطبع Playing: [title]
    • فئة Song تمتد من Media وتضيف خاصية String artist. استخدم التعليق التوضيحي @override وتجاوز play() لطباعة Playing song: [title] by [artist]
    • فئة Video تمتد من Media وتضيف خاصية int duration (بالثواني). استخدم @override وتجاوز play() لاستدعاء إصدار parent أولًا باستخدام super.play()، ثم اطبع Duration: [duration] seconds
  • main.dart: استورد ملف الوسائط ووضّح methods التي تم تجاوزها:
    • أنشئ object من Media بالعنوان 'Generic Content' واستدعِ play()
    • اطبع سطرًا فارغًا
    • أنشئ Song بالعنوان 'Imagine' وartist 'John Lennon'، ثم استدعِ play()
    • اطبع سطرًا فارغًا
    • أنشئ Video بالعنوان 'Dart Tutorial' وduration 360، ثم استدعِ play()

يوثّق التعليق التوضيحي @override نيتك ويساعد على اكتشاف الأخطاء. إذا أخطأتَ بالصدفة في كتابة play() على شكل plya()، فسينبّهك التعليق التوضيحي إلى عدم وجود method كهذه في فئة parent.

الناتج المتوقع:

Playing: Generic Content

Playing song: Imagine by John Lennon

Playing: Dart Tutorial
Duration: 360 seconds

جرّب بنفسك

import 'media.dart';

void main() {
  // TODO: Create a Media object with title 'Generic Content' and call play()
  
  
  // TODO: اطبع سطراً فارغاً
  
  
  // TODO: أنشئ Song بعنوان 'Imagine' والفنان 'John Lennon'، ثم استدعِ play()
  
  
  // TODO: اطبع سطراً فارغاً
  
  
  // TODO: Create a Video with title 'Dart Tutorial' and duration 360, then call play()
  
}
quiz iconاختبر نفسك

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

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

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