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) ذات تنفيذ. |
| الاستخدام النموذجي | يستخدم عندما يكون هناك علاقة وراثة طبيعية (مثل Animal → Dog). |
يستخدم عندما يكون هناك مجموعة من السلوكيات التي يجب أن تطبقها عدة كلاسات غير مرتبطة ببعضها. |
متى تستخدم كل منهما؟
- استخدم
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...");}
تعليقات
إرسال تعليق