تفاوت Abstract Class با Interface

در این مقاله تفاوت بین Abstract Class و Interface را در برنامه نویسی و تئوری بیان می کنیم

تفاوت Abstract Class با Interface

احتمالاً تفاوت بین Class و Interface یکی از رایجترین سوالات در دنیای Net. میباشد .از نظر تئوری 5 تفاوت اصلی بین Abstract Class و Interface وجود دارد :

1 - کلاس می تواند تعدادی از Interface ها را اجرا کند اما زیر کلاس (Subclass) فقط میتواند یک کلاس را اجرا کند

2 - کلاس می تواند هیچ متدی را در بر نگیرد(Concrete Method) در صورتی که در Interface باید شامل کلاس باشد .

3 - یک کلاس می تواند در هر زمانی فراخوانی شود در صورتی که در  interface  این عمل مقدور نیست .

به مثال ذکر شده توجه فرمایید :

interface TestInterface

{

    int x = 4;
  // در قسمت بالا interface را مقدار دهی میکنیم 

    void getMethod();

 

    string getName();

}

 

abstract class TestAbstractClass

{

    int i = 4;

    int k = 3;

    public abstract void getClassName();

}

 

با اجرای دستور بالا ما با پیغام خطا مواجه میشویم . بنابراین برای اجرای درست باید یک قسمت را حذف کنیم و کد بالا را مطابق زیر اصلاح کنیم :

 

interface TestInterface
{
    void getMethod();
    string getName();
} 

abstract class TestAbstractClass

{

    int i = 4;

    int k = 3;

    public abstract void getClassName();

}

 

کد بالا از آنجایی که هیچ مقداردهی در interface وجود ندارد به درستی کامپایل میشود.

 

4 - Abstract Class می تواند شامل Cusntructor باشد در حالی که Interface این امکان را ندارد .

به مثال زیر توجه فرمایید :

interface TestInterface

{

    // ایجاد constructor

    public TestInterface()

    {

    }

    void getMethod();

    string getName();

}

 

abstract class TestAbstractClass

{

    public TestAbstractClass()

    {

    }

    int i = 4;

    int k = 3;

    public abstract void getClassName();

}

با اجرای دستور بالا نیز با پیغام خطا مواجه میشوید .زیرا Interface نمی تواند شامل constructor باشد . بنابراین ما باید قسمت ایجاد constructor را  حذف کنیم . مانند دستور زیر :

interface TestInterface

{

    void getMethod();

    string getName();

}

 

abstract class TestAbstractClass

{

    public TestAbstractClass()

    {

    }

    int i = 4;

    int k = 3;

    public abstract void getClassName();

} 

5 - کلاس اجازه سطح دسترسی برای تمامی اعضای تعریف شده دارد در حالی که در Interface ما اجازه تعریف سطح دسترسی نداریم .

ما میتوانیم access specifier برای اعضای public تعریف کنیم .

public interface TestInterface

{

    void getMethod();

    string getName();

}

در interface اجازه تعریف access specifier نداریم .

interface TestInterface

{

    public void getMethod();

    public string getName();

}

کد بالا نیز پیغام خطا می دهد .

اما بهترین راه برای تعریف Interface در جلوگیری از access specifier در interface برای اعظا interface به صورت زیر میباشد :

interface Test

{

    void getMethod();

    string getName();

}