چه تکنولوژی می‌خواهید یاد بگیرید؟

نظرات و انتقادات خود را با ما در میان بگذارید

آپدیت روزانه

بیش از 1500 مطلب آموزشی

نیازهای روز

تفاوت بین Abstract Class و Interfaceها

کلاس‌های Abstract قادر هستند کلیه اعضا تعریف شده همانند کلاس‌ها را پیاده سازی کنند در حالی که اینترفیس‌ها فقط قادر به تعریف متد، اندیکسر، رخداد و پراپرتی‌ها می‌باشد.

abstract class MyClass 
{  
     private int _id;  
     public int Id 
     {  
         set { this._id = value; }  
         get { return this._id; }  
     }  
 } 

در صورت که کد فوق را در نرم افزار ویژوال استودیو کامپایل نماید، بدون خطا کامپایل اتمام می‌یابد. همانگونه که اشاره شد اعضا ابسترکت فقط در کلاس‌های ابسترکت قابل تعریف می‌باشند، پراپرتی مثال فوق را مجدد بازنویسی خواهیم کرد:

abstract class MyClass 
{  
     private int _id;  
     public abstract int Id 
     {  
         set { this._id = value; }  
         get { return this._id; }  
     }  
 } 

مسئله مهم در مورد کلاس‌های انتزاعی(Abstract Classes) و اینترفیس‌ها(Interfaces) این است که شما نمی توانید یک شی از روی آنها بسازید، اگر این کار را انجام دهید، با خطای کامپایلر مواجه خواهید شد.

اگر پروژه را دیباگ نماید، اعلان مبنی بر اینکه اعضا ابسترکت قادر نخواهند بود بدنه را شامل شوند در پنجره خطاها نمایان می‌شود و دیباگ با شکست مواجه می‌گردد. اعضا موجود در اینترفیس همانند اعضا ابسترکت نمی‌توانند در زمان تعریف بدنه‌ای را شامل گردند در غیر اینصورت با خطا مواجه خواهید شد:

interface IOne 
{  
   int MyProperty { get; set; }  
} 

یک کلاس می‌تواند از یک با بیش از یک اینترفیس ارث‌بری کند در حالی که هر کلاس فقط از یک کلاس یا ابسترکت کلاس ارث بری خواهد کرد:

abstract class Foo : Poo, ITest, IFoo
{

}

abstract class Poo : Test
{

}

کلیه اعضا تعریف شده در اینترفیس به صورت پیشفرض سطح دسترسی public برای آنها در نظر گرفته می‌شود اما در ابسترکت کلاس‌ها برنامه‌نویس می‌تواند هر نوع سطح دسترسی اعمال نماید:

interface Foo 
{
    void Start();
}

class Poo
{
    public void Test()
    {

    }
}

اگر برنامه‌نویس خواصی به اینترفیس اضافه نماید الزامی است در تمامی کلاس‌های مشتق شده این خواص‌ها را پیاده سازی نمود در حالی که اگر عضو در کلاس ابسترکت تعریف گردد همان عضو در کلاس‌های مشتق شده قابل دسترسی است و الزاما نیاز نخواهد بود مجدد پیاده سازی صورت گیرد:

class Foo 
{
    void Start();
}

class Poo : Foo
{
    public void Start()
    {

    }
}

انترفیس‌ها فیلد و ثبات‌ها را شامل نخواهند شد در حالی که کلاس ابسترکت می‌تواند رفتار همانند کلاس معمولی داشته باشد:

abstract class Poo
{
    public int _start;
}

به طور کلی Interfaceها چهارچوب و قابلیت‌های کلاس را مشخص خواهند کرد و یک قرارداد است ولی کلاس Abstract نوع کلاس را مشخص می‌کند.

امید نصری

0 نظر:

تعداد دیدگاه‌های کاربران : 0 دیدگاه
مهمان گرامی! برای ارسال نظر نیاز است وارد سایت شوید.


You must log on to comment.