تفاوت Interface و Abstract Class

در چندین جلسه مصاحبه از من خواسته شده تفاوت بین یک interface و abstract را توضیح دهم و چه زمانی یکی را بر دیگری ترجیح می دهیم. در این مقاله هر کدام را بصورت جداگانه تعریف می کنم و تفاوت آنها را توضیح می دهم.
تفاوت interface و abstract
تفاوت interface و abstract


  • Interface

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

در حالت عادی ارث بری از چند کلاس به طور هم زمان امکان پذیر نیست ولی اینترفیس ها این مزیت را دارند که به هر تعداد که لازم است، کلاسهای مشتق شده از آنها ارث بری کنند. این موضوع یکی از مهم‌ترین مزایای اینترفیس می‌باشد. هم چنین با استفاده از اینترفیس ها کد‌ها قابلیت بهتری در نگهداری، انعطاف پذیری و استفاده مجدد پیدا می کنند.

  • Abstract

به طور کلی، Abstract کلاسی می باشد که غیر قطعی و ناتمام است که باید در سطح فرزندانش تکمیل شود. کلاس Abstract شبیه اینترفیس می باشد ولی با دیدی وسیع تر. این کلاسها می‌تواند دارای متدهای Abstract باشند که شبیه اینترفیس فقط اعلام می شوند و باید در کلاسهای مشتق شده بازنویسی شوند. علاوه بر این، میتوان در این کلاسها متدهایی داشت که Abstract نیستند و احتیاجی به پیاده سازی آنها در کلاس های مشتق شده ندارند. تنها متدهایی از کلاس abstract الزام به پیاده سازی دارند که صریحا کلمه‌ abstract در تعریف آن متد ذکر شده باشد. این امکان نیز وجود دارد که متدهای abstract در subclass هم به صورت abstract ذکر شوند. البته به شرطی که subclass هم به صورت abstract تعریف شده باشد.

تعریف سطوح دسترسی برای متدها و خصوصیت‌ها مانند کلاسهای معمولی نیز از مزیت‌های این کلاس‌ها می باشد.

  • تفاوت بین کلاسهای Abstract و Interface

1- یک کلاس معمولی تنها می‌تواند از یک کلاس Abstract ارث بری کند ولی همان کلاس می تواند از چندین اینترفیس ارث ببرد.

2- یک اینترفیس فقط می تواند اعلان متدها و خصوصیت ها را داشته باشد، اما یک کلاس Abstract علاوه بر آنها می تواند متدها و خصوصیت هایی با کدهای کامل داشته باشد.

3- عناصر موجود در کلاس Abstract می توانند مانند یک کلاس معمولی دارای سطح دسترسی باشند، ولی اینترفیس ها فاقد این امکان هستند.

4- کلاس‌های Abstract مانند کلاسهای معمولی می‌توانند دارای فیلد و عناصر دیگری (مثل ثابت‌ها) باشند، در حالیکه یک اینترفیس فاقد این امکان می‌باشد. همچنین کلاس abstract می تواند شامل سازنده باشد، اما اینترفیس نمی تواند.

5- اینترفیس تنها می تواند از اینترفیس ارث بری کند اما کلاس abstract می تواند از اینترفیس، کلاس Abstract و یا سایر کلاس‌ها ارث بری کند.

  • چه زمانی از Interface ‌ها و یا کلاسهای Abstract استفاده کنیم؟

1- مواقعی که نیاز به وراثت چند گانه داریم باید از اینترفیس استفاده کنیم، به دلیل اینکه این امکان در کلاس‌های Abstract وجود ندارد.

2- زمانی که بخواهیم تمام متدهای معرفی شده در کلاس پایه به طور کامل در کلاس مشتق شده پیاده شوند باید از اینترفیس استفاده کنیم.

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

4- با توجه به اینکه به غیر از اعلان متدها و خصوصیت‌ها امکان تعریف عناصر دیگری در اینترفیس ها وجود ندارد، در صورتیکه ملزم به استفاده از این عناصر باشیم، استفاده از کلاسهای Abstract ضروری می‌باشد.

5- در صورتی که نخواهیم کلیه متد‌ها در کلاس‌های مشتق شده پیاده سازی شوند و تعدادی از آنها را در کلاس پدر کدنویسی کنیم، باید از کلاس Abstract استفاده کنیم.

6- به طور کلی یک اینترفیس چارچوب و قابلیتهای یک کلاس را مشخص می کند و یک قرارداد است، ولی کلاس Abstract نوع کلاس را معین می‌کند. این تفاوت کمک بسیاری برای تشخیص زمان استفاده از این دو را به برنامه نویسان می دهد.

پایان