مقدمه
ابتدا مقدمهای در مورد کلاسهای abstract میآوریم. از کلاسها نمیتوان یک نمونه ساخت؛ اما سوال این است که چرا ما به کلاسهایی نیاز داریم که نمیتوان یک نمونه از آنها ایجاد کرد؟ این کلاسها قابلیت ارثبری دارند، به طور کلی نمیتوان از آنها یک نمونه ایجاد کرد، ولی کلاسهای دیگر میتوانند از آن به ارث برسند.
مزیت این کلاسها این است که سلسله مراتبی برای کلاسهایی که از آن به ارث رسیدهاند مشخص میکند؛ به عبارت سادهتر قراردادی است که تمامی کلاسهای به ارثرسیده از آن را مجبور میکند آن را در سلسله مراتبی خود رعایت کنند.
اما منظور از interfaceچیست؟ همانطور که از اسم آن مشخص است به معنای رابط است، اما چه رابطی؟
در interface هیچ پیادهسازی صورت نمیگیرد؛ در واقع معرفی الگوها بدون بدنه (پیادهسازی) است و مانند یک کلاس abstract عمل میکند که یک قرارداد برای سلسله مراتب کلاسهای مشتق شده مشخص میکند، اما تفاوت عمده آن با یک abstract کلاس در چیست؟
همانطور که میدانید در #C و جاوا؛ مانند++C ارثبری چندگانه نداریم، یعنی یک کلاس میتواند فقط از یک کلاس دیگر به ارث برسد، اما یک کلاس میتواند از چند interface ارثبری داشته باشد.
اما در نهایت هر دوی اینها چه کمکی به شما میکنند؟
زمانی که شما یک interface معرفی میکنید، در واقع یکسری الگو و خصوصیت تعریف کردهاید که پیادهسازی نشده است، کلاسی که این interface را پیاده میکند، این مزیت را به شما میدهد تا کلاس شما بتواند بخشی از دو کلاس باشد؛ یکی از طریق ارثبری در سلسله مراتب وراثتی کلاسها و دیگری پیادهسازی یک رابط.
در بالا با برخی شباهتها و تفاوتهای کلاس abstract و interface آشنا شدیم. در زیر برخی از این شباهتها و تفاوتها را به صورت ساختار بندی شده توضیح میدهیم.
ارثبری چندگانه
یک کلاس میتواند از یک کلاس abstract ارثبری داشته باشد.یک کلاس میتواند از چند interface به ارث برسد (اصطلاحا چند interface را پیاده میکند).
پیادهسازی پیشفرض
یک کلاس abstract میتواند دارای یکسری اعضا باشد که پیادهسازی شدهاند و یکسری اعضا که پیادهسازی آنها بر عهده کلاسهایی است که از آن به ارث رسیدهاند. (این اجزا با کلمه کلیدی abstract مشخص میشود).یک interface هیچ پیادهسازی را شامل نمیشود، بلکه فقط معرفی یک ساختار عملیاتی است.(البته درجاوا نسخه 8 این امکان اضافه شده که یک واسط متد پیشفرض داشته باشد.)
دسترسی به اجزا
در یک کلاس abstract میتوان سطوح دسترسی به یک جزء از کلاس را مشخص کرد.در یک رابط هیچ صحبتی از سطوح دسترسی به میان نمیآید و تمام متدها عمومی هستند.
فیلدها و ثابتها
یک کلاس abstract میتواند شامل فیلدها و ثابتهای مختلفی باشد.یک رابط نمیتواند شامل یک فیلد یا یک ثابت باشد و در صورت تعریف متغیر به صورت استاتیک، غیر قابل تغییر و عمومی (final, static) در نظر گرفته میشود.
اضافهکردن یک عملیات جدید
به راحتی میتوانید یک الگوی خاص به کلاس abstractاضافه کنید، بدون اینکه نیاز داشته باشید در کلاسهای مشتقشده تغییری بدهید.اگر بخواهید الگویی جدید به یک interface اضافه کنید، باید این متد را پیادهسازی کنید.
همانطور که مشاهده کردید interface و کلاس abstract هریک مزایا و معایب خود را دارد. اینکه کدام در چه جایی میتواند راهحل شما باشد، به عهده شماست (طراح).
چه زمانی از Interfaceها یا کلاسهای Abstract استفاده کنیم؟
- با توجه به توضیحات ذکر شده مواقعی که نیاز به وراثت چند گانه داریم باید از Interface استفاده کنیم ، به دلیل اینکه این امکان در کلاس های Abstract وجود ندارد .
- زمانی که بخواهیم تمام متدهای معرفی شده در کلاس پایه به طور کامل در کلاس مشتق شده پیاده شود باید از Interface استفاده کنیم.
- وقتی در پروژه های بزرگ با تغییرات زیادی مواجه هستیم استفاده از کلاس Abstract توصیه میشود چون با تغییر آن به طور خودکار تغییرات در کلاسهای مشتق شده اعمال میشود .
- با توجه به اینکه به غیر از اعلان متدها و خصوصیتها امکان تعریف عناصر دیگر در Interfaceها وجود ندارد، در صورتی که ملزم به استفاده از این عناصر باشیم، استفاده از کلاسهای Abstract ضروری میباشد.
- در صورتی که نخواهیم کلیه متدها در کلاسهای مشتق شده پیاده شود و تعدادی از آنها را در کلاس پدر کدنویسی کنیم، باید از کلاس Abstract استفاده کنیم.
- به طور کلی Interfaceها چارچوب و قابلیتهای کلاس را مشخص میکند و یک قرارداد است ولی کلاس Abstract نوع کلاس را معین میکند. این تفاوت کمک بسیاری برای تشخیص زمان استفاده از این دو را، به برنامه نویسان میدهد .
در آخر باید یادآور شوم که اینترفیس کلاس نیست بلکه یک قالب، یک ساختار و مفهوم است مانند کلاس اما کلاس نیست. به دلیل استفادهی بعضا مشابه، با کلاس Abstract مقایسه میشود.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.