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

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

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

بينما يمكن للفئة أن ترث من فئة أساسية واحدة فقط، يمكنها تنفيذ أي عدد من الواجهات حسب الحاجة. وهذه إحدى المزايا الرئيسية التي تتمتع بها الواجهات مقارنةً بالفئات المجرّدة؛ إذ تتيح للفئة اعتماد سلوكيات متعددة.

لتنفيذ عدة واجهات، ما عليك سوى إدراجها بعد النقطتين، مع فصلها بفواصل:

public interface IFlyable
{
    void Fly();
}

public interface ISwimmable
{
    void Swim();
}

public class Duck : IFlyable, ISwimmable
{
    public void Fly()
    {
        Console.WriteLine("Flying through the air");
    }
    
    public void Swim()
    {
        Console.WriteLine("Swimming in the pond");
    }
}

يجب أن تنفّذ الفئة Duck جميع الأعضاء من كلتا الواجهتين. يحاكي هذا سيناريوهات العالم الحقيقي بشكل طبيعي - فالبطة تستطيع فعليًا الطيران والسباحة معًا، لذا من المنطقي أن تفي بكلا العقدين.

عند الجمع بين الوراثة والواجهات المتعددة، يجب أن تأتي الفئة الأساسية أولًا:

public class Duck : Bird, IFlyable, ISwimmable
{
    // يرث من Bird، وينفذ كلا الواجهتين
}

تتيح لك هذه المرونة تركيب السلوكيات من مصادر متعددة. قد تطبّق Robot الواجهات IMovable وIChargeable وISpeakable. تمثّل كل واجهة قدرة واحدة، ويمكن لفئتك المزج والمواءمة بدقة لما تحتاج إليه.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لأجهزة المنزل الذكي يوضّح كيف يمكن لفئة واحدة أن تنفّذ عدة interfaces لاكتساب إمكانات مختلفة. ستنشئ أجهزة يمكن التحكم فيها، وتحتوي أيضًا على ميزات لإدارة الطاقة.

ستنظّم شيفرتك عبر أربعة ملفات:

  • IControllable.cs: عرّف interface باسم IControllable في مساحة الأسماء SmartHome. يمثّل هذا interface الأجهزة التي يمكن تشغيلها وإيقاف تشغيلها. ويجب أن يعلن عن methods اثنتين: TurnOn() وTurnOff()، وكلتاهما تعيدان قيمة من النوع string.
  • INetworkConnected.cs: عرّف interface باسم INetworkConnected في مساحة الأسماء SmartHome. يمثّل هذا interface الأجهزة التي يمكنها الاتصال بشبكة. ويجب أن يعلن عن method باسم Connect(string network) يعيد قيمة من النوع string.
  • SmartTV.cs: عرّف class باسم SmartTV في مساحة الأسماء SmartHome، بحيث تنفّذ كلًا من IControllable وINetworkConnected. يجب أن يحتوي التلفاز على خاصية Brand من النوع string، وخاصية ScreenSize من النوع int، التي تمثّل المقاس بالبوصة. أنشئ Constructor يقبل القيمتين كلتيهما. نفّذ جميع methods الخاصة بـinterfaces:
    • TurnOn() تعيد "{Brand} {ScreenSize}-inch TV is now ON"
    • TurnOff() تعيد "{Brand} {ScreenSize}-inch TV is now OFF"
    • Connect(string network) تعيد "{Brand} TV connected to {network}"
  • Program.cs: في ملفك الرئيسي، أنشئ SmartTV باستخدام قيم الإدخال. وضّح مرونة interfaces المتعددة من خلال تخزين كائن التلفاز نفسه في ثلاثة أنواع مختلفة من المتغيرات: النوع SmartTV الملموس، ومتغير من النوع IControllable، ومتغير من النوع INetworkConnected. استدعِ methods المناسبة عبر كل مرجع، لإظهار كيف يمكن التعامل مع الكائن نفسه بطرق مختلفة اعتمادًا على interface الذي تعمل معه.

ستتلقى ثلاثة مدخلات:

  • اسم علامة التلفاز التجارية
  • مقاس الشاشة بالبوصة
  • اسم الشبكة المراد الاتصال بها

اطبع الناتج بهذا التنسيق:

Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}

على سبيل المثال، إذا كانت المدخلات هي Samsung و55 وHomeWiFi، فيجب أن يكون الناتج:

Via SmartTV:
Samsung 55-inch TV is now ON
Samsung TV connected to HomeWiFi
Via IControllable:
Samsung 55-inch TV is now OFF
Via INetworkConnected:
Samsung TV connected to HomeWiFi

لاحظ كيف يمكن الوصول إلى كائن SmartTV نفسه عبر مراجع مختلفة لـinterfaces. عند تخزينه باعتباره IControllable، يمكنك فقط استدعاء methods التحكم. وعند تخزينه باعتباره INetworkConnected، يمكنك فقط استدعاء methods الشبكة. هذه هي قوة تنفيذ interfaces متعددة — إذ تكتسب class واحدة إمكانات متعددة، مع الحفاظ على المرونة في طريقة استخدامها!

جرّب بنفسك

using System;
using SmartHome;

class Program
{
    public static void Main(string[] args)
    {
        // اقرأ المدخلات
        string brand = Console.ReadLine();
        int screenSize = Convert.ToInt32(Console.ReadLine());
        string network = Console.ReadLine();
        
        // TODO: أنشئ كائن SmartTV بالقيم المدخلة
        
        // TODO: خزّن نفس كائن التلفزيون في ثلاثة أنواع متغيرات مختلفة:
        // 1. نوع SmartTV (فئة ملموسة)
        // 2. IControllable type (interface reference)
        // 3. INetworkConnected type (interface reference)
        
        // TODO: اطبع المخرجات بالتنسيق المطلوب:
        // Via SmartTV:
        // - استدعِ TurnOn() و Connect(network)
        // Via IControllable:
        // - استدعِ TurnOff()
        // Via INetworkConnected:
        // - استدعِ Connect(network)
        
    }
}
quiz iconاختبر نفسك

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

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

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