Menu
CoddyTech

الكلمات المفتاحية Virtual و Override

جزء من قسم البرمجة كائنية التوجه في رحلة C# على Coddy. الدرس 21 من 70.

عندما ترث فئة مشتقة دالة، قد ترغب أحيانًا في تغيير طريقة عمل تلك الدالة بالكامل. تعمل الكلمتان المفتاحيتان virtual وoverride معًا لإتاحة ذلك بطريقة مضبوطة.

علِّم أسلوبًا بأنه virtual في الفئة الأساسية للإشارة إلى أن الفئات المشتقة يُسمح لها باستبدال تنفيذه:

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("Some sound");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Woof!");
    }
}

تخبر الكلمة المفتاحية override في الفئة المشتقة المترجم بأنك تستبدل عمدًا الطريقة الأساسية. من دون virtual في الطريقة الأساسية، لا يمكنك استخدام override.

تظهر القوة الحقيقية عندما تستخدم مرجعًا إلى فئة أساسية للاحتفاظ بكائن مشتق:

Animal myPet = new Dog();
myPet.Speak();  // الناتج: Woof!

على الرغم من أن myPet مُعرَّف على أنه Animal، يستدعي C# إصدار Dog من Speak(). يُسمّى هذا تعدد الأشكال وقت التشغيل - إذ تعتمد الطريقة الفعلية التي يتم استدعاؤها على النوع الحقيقي للكائن، لا على النوع المُعلن للمتغير.

لا يزال بإمكانك الوصول إلى التنفيذ الأساسي باستخدام base.Speak() داخل التجاوز إذا أردت توسيع السلوك بدلًا من استبداله بالكامل.

challenge icon

التحدي

سهل

لنبنِ نظام إشعارات يوضّح كيف يمكن للفئات المشتقة تجاوز سلوك الفئة الأساسية بالكامل باستخدام الكلمتين الأساسيتين virtual وoverride، مع إظهار قوة تعدد الأشكال وقت التشغيل.

ستنشئ ثلاثة ملفات لتنظيم التعليمات البرمجية:

  • Notification.cs: عرّف فئة Notification في مساحة الأسماء Alerts. تمثّل هذه الفئة الأساسية إشعارًا عامًا، وتتضمن خاصية Message (من النوع string) ومُنشئًا يعيّن قيمتها. أضف طريقة virtual تُسمّى Send() وتُعيد "Sending notification: {Message}".
  • EmailNotification.cs: عرّف فئة EmailNotification في مساحة الأسماء Alerts، بحيث ترث من Notification. أضف خاصية Recipient (من النوع string) ومُنشئًا يقبل الرسالة والمستلِم معًا (استخدم base لتمرير الرسالة). أعد تعريف الطريقة Send() لتُعيد "Emailing {Recipient}: {Message}".
  • SmsNotification.cs: عرّف فئة SmsNotification في مساحة الأسماء Alerts، بحيث ترث أيضًا من Notification. أضف خاصية PhoneNumber (من النوع string) ومُنشئًا يقبل الرسالة ورقم الهاتف معًا. أعد تعريف Send() لتُعيد "SMS to {PhoneNumber}: {Message}".
  • Program.cs: أنشئ في ملفك الرئيسي كائنات من أنواع الإشعارات الثلاثة باستخدام قيم الإدخال. ثم اعرض تعدد الأشكال وقت التشغيل من خلال تخزين الكائنات الثلاثة في متغيرات من النوع Notification واستدعاء Send() على كل منها.

ستتلقى أربعة مدخلات:

  • نص الإشعار
  • عنوان البريد الإلكتروني للمستلِم
  • رقم الهاتف للرسائل النصية القصيرة

اطبع نتيجة استدعاء Send() لكل إشعار، بعد تخزينه كمرجع إلى الفئة الأساسية:

{base notification Send() result}
{email notification Send() result}
{sms notification Send() result}

على سبيل المثال، إذا كانت المدخلات هي Meeting at 3pm وalice@email.com و555-1234، فينبغي أن يكون الناتج:

Sending notification: Meeting at 3pm
Emailing alice@email.com: Meeting at 3pm
SMS to 555-1234: Meeting at 3pm

لاحظ أنه على الرغم من تخزين الكائنات الثلاثة جميعها في متغيرات من النوع Notification، فإن كلًا منها يستدعي نسخته الخاصة المعاد تعريفها من Send(). هذا هو تعدد الأشكال وقت التشغيل عمليًا!

جرّب بنفسك

using System;
using Alerts;

class Program
{
    public static void Main(string[] args)
    {
        // اقرأ المدخلات
        string message = Console.ReadLine();
        string email = Console.ReadLine();
        string phone = Console.ReadLine();

        // TODO: أنشئ كائنات من أنواع الإشعارات الثلاثة جميعها
        // خزّنها في متغيرات من النوع Notification لتوضيح تعدد الأشكال
        
        // TODO: أنشئ كائنًا من الفئة الأساسية Notification
        Notification baseNotification;
        
        // TODO: أنشئ كائنًا من EmailNotification (مخزّنًا في متغير من النوع Notification)
        Notification emailNotification;
        
        // TODO: أنشئ كائنًا من SmsNotification (مخزّنًا في متغير من النوع Notification)
        Notification smsNotification;
        
        // TODO: استدعِ Send() على كل منها واطبع النتائج
        // سيُستدعى التنفيذ المُعاد تعريفه لكل طريقة بفضل تعدد الأشكال في وقت التشغيل
    }
}
quiz iconاختبر نفسك

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

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

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