C# - Interface vs Abstract class

 

الفرق بين interface و abstract class في C#:

الميزة abstract class interface
الدالة المجردة يمكن أن يحتوي على دوال مجردة (abstract) وغير مجردة (عادية). جميع الدوال افتراضيًا مجردة (قبل C# 8.0)، ويجب أن تُنفّذ في الكلاس المشتق.
الحقول (Fields) يمكن أن يحتوي على حقول (fields). لا يمكن أن يحتوي على حقول مباشرة (قبل C# 8.0).
المُعاملات (Constructors) يمكن أن يحتوي على Constructor. لا يحتوي على Constructor.
التوريث (Inheritance) يمكن أن يرث من كلاس آخر (class) أو من كلاس مجرد (abstract class). لا يمكنه الوراثة، لكنه يمكن تطبيقه على عدة كلاسّات (Multiple Inheritance).
دعم الوراثة المتعددة لا يدعم الوراثة المتعددة (Multiple Inheritance). يمكن أن يطبّق (implements) من قبل عدة كلاسّات، ويمكن للكلاس الواحد تطبيق عدة واجهات.
الوصول إلى الدوال يمكن أن يحتوي على دوال public, protected, private. كل الدوال افتراضيًا public (قبل C# 8.0).
التطبيق الافتراضي (Default Implementation) يمكن أن يحتوي على كود افتراضي في الدوال. منذ C# 8.0، يمكن أن يحتوي على دوال افتراضية (Default Methods) ذات تنفيذ.
الاستخدام النموذجي يستخدم عندما يكون هناك علاقة وراثة طبيعية (مثل AnimalDog). يستخدم عندما يكون هناك مجموعة من السلوكيات التي يجب أن تطبقها عدة كلاسات غير مرتبطة ببعضها.


متى تستخدم كل منهما؟

  • استخدم abstract class عندما تحتاج إلى توفير وظائف افتراضية مشتركة مع إمكانية وجود كود جاهز في بعض الدوال.
  • استخدم interface عندما تحتاج إلى فرض التزام (Contract) على الكلاسات المختلفة بدون فرض طريقة تنفيذ معينة.

مثال على abstract class:

abstract class Animal
{
public abstract void MakeSound(); // دالة مجردة
public void Sleep() => Console.WriteLine("Sleeping..."); // دالة عادية
}
class Dog : Animal
{
public override void MakeSound() => Console.WriteLine("Woof! Woof!");
}

مثال على interface:

interface IAnimal
{
void MakeSound(); // لا يحتوي على تنفيذ
}
class Dog : IAnimal
{
public void MakeSound() => Console.WriteLine("Woof! Woof!");
}

إذا كنت تحتاج إلى دعم كلا الحالتين، يمكن للكلاس أن يرث من abstract class ويطبّق interface في نفس الوقت.

مثال:

abstract class Animal
{
public abstract void Eat();
}
interface IMovable
{
void Move();
}
class Dog : Animal, IMovable
{
public override void Eat() => Console.WriteLine("Eating...");
public void Move() => Console.WriteLine("Running...");
}


تعليقات

المشاركات الشائعة من هذه المدونة

HTML - Text Formatting تنسيقات النص

HTML - ملخص شامل لأهم التاجات

Excel - استخدام الفلاتر (Filters) لتركيز التحليل