شنبه, ۸ اردیبهشت, ۱۴۰۳ / 27 April, 2024
مجله ویستا

تفاوت interface و کلاس های abstract


تفاوت interface و کلاس های abstract

رابط ها, مفهومی انتزاعی به کارها می بخشد

ابتدا مقدمه‌ای در مورد کلاس‌های abstract می‌‌آوریم. از کلاس‌ها نمی‌توان یک نمونه ساخت؛‌ اما سوال این است که چرا ما به کلاس‌هایی نیاز داریم که نمی‌توان یک نمونه از آنها ایجاد کرد؟

این کلاس‌ها قابلیت ارث‌ بری دارند، به طور کلی نمی‌توان از آنها یک نمونه ایجاد کرد، ولی کلاس‌های دیگر می‌توانند از آن به ارث برسند.

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

اما منظور از interface‌چیست؟ همان‌طور که از اسم آن مشخص است به معنای رابط است، اما چه رابطی؟

در interface هیچ پیاده‌سازی صورت نمی‌گیرد؛ در واقع معرفی الگوها بدون بدنه (پیاده‌ سازی) است و مانند یک کلاس abstract عمل می‌کند که یک قرارداد برای سلسله مراتب کلاس‌های مشتق شده مشخص می‌کند، اما تفاوت عمده آن با یک abstract کلاس در چیست؟

همان‌طور که می‌دانید در #C و جاوا مانند++C ارث‌بری چندگانه نداریم، یعنی یک کلاس می‌تواند فقط از یک کلاس دیگر به ارث برسد، اما یک کلاس می‌تواند از چند interface ارث‌بری داشته باشد.

● اما در نهایت هر دوی اینها چه کمکی به شما می‌کنند؟

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

اگرچه یک کلاس abstract‌ رفتاری مشابه یک interface‌ دارد، اما ماهیتا یک کلاس بوده و این خصوصیت تعیین می‌کند در یک کلاس abstract می‌تواند یک یا چند متد abstract داشته باشد.

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

اگر یک کلاس abstract همه اعضای خود را به صورت abstract تعریف کرده باشد، دقیقا مانند یک رابط با آن رفتار می‌شود.

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

● ارث‌بری چندگانه

یک کلاس می‌تواند از یک کلاس abstract‌ ارث‌بری داشته باشد.

یک کلاس می‌تواند از چند interface به ارث برسد (اصطلاحا چند interface را پیاده می‌کند).

● پیاده‌سازی پیشفرض

یک کلاس abstract می‌تواند دارای یک‌سری اعضا باشد که پیاده‌سازی شده‌اند و یکسری اعضا که پیاده‌سازی آنها بر عهده کلاس‌هایی است که از آن به ارث رسیده‌اند. (این اجزا با کلمه کلیدی abstract مشخص می‌شود).

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

● دسترسی به اجزا

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

در یک رابط هیچ صحبتی از سطوح دسترسی به میان نمی‌آید.

● فیلد‌ها و ثابت‌ها

یک کلاس abstract می‌تواند شامل فیلد‌ها و ثابت‌های مختلفی باشد.

یک رابط نمی‌تواند شامل یک فیلد یا یک ثابت باشد.

● اضافه‌کردن یک عملیات جدید

براحتی می‌توانید یک الگوی خاص به کلاس abstract‌اضافه کنید، بدون این‌که نیاز داشته باشید در کلاس‌های مشتق‌شده تغییری بدهید.

اگر بخواهید الگویی جدید به یک interface اضافه کنید، باید این متد را پیاده‌سازی کنید.

همان‌طور که مشاهده کردید interface و کلاس abstract هریک مزایا و معایب خود را دارد. این‌که کدام در چه جایی می‌تواند راه‌حل شما باشد، به عهده شماست.

برای دسترسی به اطلاعات بیشتر می‌توانید

به لینک‌ زیر مراجعه کنید:

http://www.codeproject.com/Articles/۱۱۱۵۵/Abstract-Class-versus-Interface

۲ـ http://geekswithblogs.net/mahesh/archive/۲۰۰۶/۰۷/۰۵/۸۴۱۲۰.aspx

۳ـ http://programmingincsharp.com/what-is-the-difference-between-an-abstract-class-and-an-interface-in-c/

امیربهاءالدین سبط ‌الشیخ



همچنین مشاهده کنید