اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

إذا فهمتهم بالشكل المطلوب فلن تجد مشكلة سواء كان في لغة سي شارب أو أي لغة أخرى، Polymorphism هو مفهوم في البرمجة الكائنية يسمح لك باستخدام كائنات من فئات مختلفة بشكل يمكن التنبؤ به، يوجد نوعان رئيسيان من Polymorphism، أولا Compile-time Polymorphism أو التعددية الشكلية في وقت الترجمة مثل تعدد الدوال وتعدد المعاملات.

و يوجد أيضا Run-time Polymorphism التي تسمى التعددية الشكلية في وقت التشغيل مثل إعادة تعريف الدوال، و يحدث هذا النوع عندما يتم تعريف دالة في الفئة الأساسية  ويتم إعادة تعريفها في الفئة المشتقة و هذا مثال بسيط عليه:

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

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

public class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("Cat meows.");
    }
}

// استخدام Polymorphism
Animal myAnimal = new Dog();
myAnimal.Speak();  // سيطبع "Dog barks."

بالنسبة ل Abstract Class هي فئة لا يمكن إنشاء كائنات منها بشكل مباشر، و تحتوي على دوال يمكن أن تكون مجردة أي بدون تنفيذ، ويجب على الفئات المشتقة أن تعيد تعريفها، و يمكن للفئة المجردة أن تحتوي على دوال عادية مع تنفيذ كامل بهذا الشكل:

public abstract class Animal
{
    public abstract void Speak(); // دالة مجردة

    public void Sleep()
    {
        Console.WriteLine("Animal is sleeping.");
    }
}

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

// لا يمكن إنشاء كائن من الفئة المجردة مباشرة
// Animal myAnimal = new Animal();  // سيؤدي هذا إلى خطأ

Dog myDog = new Dog();
myDog.Speak();  // سيطبع "Dog barks."
myDog.Sleep();  // سيطبع "Animal is sleeping."

أما Interface هي عقد يحدد مجموعة من الدوال أو الخصائص التي يجب على الفئة التي تنفذ الواجهة أن تعرفها، و الواجهة لا تحتوي على تنفيذ فعلي، فقط تعريف للدوال والخصائص، و يمكن للفئة أن ترث من واجهات متعددة بهذا الشكل:

public interface IAnimal
{
    void Speak();
    void Sleep();
}

public class Dog : IAnimal
{
    public void Speak()
    {
        Console.WriteLine("Dog barks.");
    }

    public void Sleep()
    {
        Console.WriteLine("Dog is sleeping.");
    }
}

IAnimal myDog = new Dog();
myDog.Speak();  // سيطبع "Dog barks."
myDog.Sleep();  // سيطبع "Dog is sleeping."

و الفرق بين Abstract Class و Interface هو أن Abstract Class يمكن أن تحتوي على دوال عادية مع تنفيذ فعلي، بينما Interface لا يمكنها احتواء أي تنفيذ، و يمكن للفئة أن ترث من فئة مجردة واحدة فقط، ولكن يمكن أن تنفذ واجهات متعددة.

 

  • 0
نشر

بشكل مٌبسط،  Polymorphism أو تعدد الأشكال عبارة عن قدرة الكائن على اتخاذ أشكال متعددة، أي يمكن لكائن من صنف معين أن يتصرف بطرق مختلفة اعتمادًا على السياق.

بمعنى تخيل أن لديك صنف اسمه "حيوان" وصنفين فرعيين منه هما "قطة" و "كلب".

تستطيع إنشاء متغير من نوع "حيوان" وإسناد إليه إما كائن من نوع "قطة" أو "كلب"، وعند استدعاء دالة مثل "اصدر صوتًا" على ذلك المتغير، سيتم تنفيذ الدالة الخاصة بالصنف الفرعي (قطة أو كلب) المخزن في المتغير.

 

وبخصوص أنواع Polymorphism في C#:

  1. Static Polymorphism تعدد الأشكال الساكن: والذي يتم تحديده في وقت الترجمة Compile Time من خلال Overloading (زيادة التحميل) للـ Methods و Operators.
  2. Dynamic Polymorphism تعدد الأشكال الديناميكي: يُحدد في وقت التشغيل Runtime من خلال Overriding (التجاوز) للـ Methods باستخدام الكلمات المفتاحية virtual, override, و abstract.

2- Abstract Class الصنف المجرد هو صنف لا يمكن إنشاء كائنات منه مباشرة، ويستخدم كقالب للصفات والوظائف المشتركة بين الأصناف الفرعية.

وله الخصائص التالية:

  • يُعرّف باستخدام الكلمة المفتاحية abstract.
  • متاح له أن يحتوي على دوال مجردة Abstract Methods ودوال غير مجردة.
  • الدوال المجردة لا تحتوي على تنفيذ Implementation داخل الصنف المجرد، ويجب على الأصناف الفرعية التي ترث منه توفير تنفيذ لهذه الدوال.

مثلاً إنشاء صنف مجرد "شكل" يحتوي على دالة مجردة "احسب المساحة"، وستقوم الأصناف الفرعية مثل "مربع" و "دائرة" بوراثة ذلك الصنف وتوفير تنفيذ خاص بها لدالة "احسب المساحة".

3- Interface الواجهة هي بمثابة عقد Contract يحدد مجموعة من الدوال التي يجب على الصنف الذي ينفذها توفيرها.

ولها الخصائص التالية:

  • تُعرّف باستخدام الكلمة المفتاحية interface.
  • تحتوي فقط على تعريفات دوال Signatures ولا تحتوي على أي تنفيذ.
  • متاح للصنف أن ينفذ أكثر من واجهة.

مثل إنشاء واجهة "قابلة للرسم" تحتوي على دالة "ارسم"، فيمكن للعديد من الأصناف مثل "دائرة" و "مربع" و "صورة" تنفيذ هذه الواجهة وتوفير تنفيذ خاص بها لدالة "ارسم".

بالتالي الواجهة الغرض منها تحديد سلوك Behavior معين يمكن للعديد من الأصناف تطبيقه، بينما الصنف المجرد هو لتوفير هيكل أساسي مشترك للأصناف الفرعية

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...