PDA

View Full Version : سوال: تفاوت Interface با کلاس Abstract



alireza_g698
پنج شنبه 03 مهر 1393, 19:12 عصر
سلام
تفاوت Interface با کلاس Abstract چیست؟
لطفا راهنمایی بفرمایید
با تشکر

Rejnev
پنج شنبه 03 مهر 1393, 19:41 عصر
یک کلاس میتونه چندین interface رو Implement کنه ولی در هر تعریف فقط از یک کلاس ارث بری میکنه.

omid nasri
جمعه 04 مهر 1393, 00:30 صبح
interface ها رابط محصوب میشن، این امر در WCF بیشتر به چشم میخوره، در

interface شما نمی تویند فیلد یا پراپرتی داشته باشد

شما نمی توانید به صورت مستقیم به توابع سطح دسترسی بدید.

توابع میتونند ورودی قبول کنند.

کلاس ها میتونند هر چند interface قبول کنند اما برای کلاس فقط یکی

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

طبق گفته مایکروسافت نوع تعریف یک interface بهینه است که دو حرف اول بزرگ تعریف شود به مثال روبرو : IInterface که باید حرف اول I باشد ، که مخفف Interface میباشد.

اینم تفاوت :

در حالیکه ممکن است بین یک Abstract Class (کلاس مجرد) و یک اینترفیس تشابهات زیادی وجود بنظر برسد اما تفاوتهای بین آن دو بیشتر است.

Abstract کلاس نمی تواند Sealed or Static تعریف شود.


تفاوتها و اینکه کجا بهتر است از کدام استفاده کنیم :


کلاس مجرد یکی از انواع کلاس است اما اینترفیس یک کلاس نیست.
اینترفیس یک قرارداد را مشخص میکند اما کلاس مجرد ناتمام ماندن تعریف یک کلاس را.
یک اینترفیس به هیچ عنوان نمیتواند شامل پیاده سازی درون خود باشد اما یک کلاس مجرد میتواند شامل پیاده سازیهای پیشفرض باشد (اعضایی داشته باشد که بصورت کامل و یا پیشفرض پیاده سازی شده اند)
یک کلاس میتواند چندین اینترفیس را پیاده سازی کند اما تنها میتواند از یک کلاس مجرد به ارث رود.
بصورت پیشفرض اعضای یک اینترفیس تماما public هستند و نمیتوان برای آنها access modifier انتخاب کرد در حالیکه در یک کلاس مجرد ممکن است.
یک کلاس مجرد میتواند شامل فیلد، constructor، destructor و مقادیر ثابت باشد درحالیکه یک اینترفیس نمیتواند.
بصورت کلی کار کردن با یک کلاس مجرد سریعتر از یک اینترفیس است.
اینترفیسها برای نشان دادن قابلیتهای جانبی یک کلاس بکار میروند (مثلا چون هم انسان و هم اتومبیل حرکت میکنند هر دو میتوانند اینترفیس IMovable رو پیاده سازی کنند) درحالیکه یک کلاس مجرد خواص و رفتارهای اصلی یک کلاس را مشخص میکند.
مورد قبلی بصورت خلاصه میشود : یک اینترفیس اغلب برای رابطه هایی مانند can-do و یا able-to استفاده میشود در حالیکه یک کلاس مجرد برای رابطه هایی از نوع : is-a
اگر برای مثال یک متود را به یک اینترفیس اضافه کنیم باید تمامی جاهاییکه آن اینترفیس پیاده سازی شده را دنبال و متود مورد نظر را در آنجا پیاده سازی کنیم در حالیکه اگر از یک کلاس مجرد استفاده کنیم میتوانیم در همانجا متود را با پیاده سازی پیشفرض تعریف کنیم تا به مشکل برنخوریم.
برای ایجاد خواص و رفتارهای مشابه روی مجموعه های بزرگ و نامرتبط از موجودات بهتر است از اینترفیس کمک بگیریم. یک کلاس مجرد تنها برای دسته بندی موجودات مرتبط بکار میرود.
... ادامه دارد

توجه : برخی از موارد بالا ممکن است کاملا معنای یکسانی داشته باشند و تنها در ساختار جمله بندی و یا زاویه ی نگرش تفاوت داشته باشند.
منابع :
http://www.codeproject.com/KB/cs/abs...nterfaces.aspx (http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx)
http://msdn2.microsoft.com/en-us/library/scsyfw1d(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/scsyfw1d%28vs.71%29.aspx)
http://geekswithblogs.net/mahesh/arc.../05/84120.aspx (http://geekswithblogs.net/mahesh/archive/2006/07/05/84120.aspx)
http://www.interviewcorner.com/Answe...orCategoryId=1 (http://www.interviewcorner.com/Answer/Answers.aspx?QuestionId=267&MajorCategoryId=1&MinorCategoryId=1)
http://www.clt-services.com/docs/Abs...Interfaces.pdf (http://www.clt-services.com/docs/Abstract-Classes-vs-Interfaces.pdf)
http://technologyandme.wordpress.com...bstract-class/ (http://technologyandme.wordpress.com/2006/06/04/interface-vs-abstract-class/)

mreram
جمعه 04 مهر 1393, 01:08 صبح
تفاوت های مهمش :
کلاس abstract شده ارث بری نداره ولی interface اینطور نیست
interface مجموعه ای از متدهارو مشخص میکنه و بدنه نداره یعنی فقط متد رو اجرا میکنه و به چگونگی انجامش کاری نداره...

elec60
جمعه 04 مهر 1393, 12:53 عصر
تفاوت های مهمش :
کلاس abstract شده ارث بری نداره ولی interface اینطور نیست
interface مجموعه ای از متدهارو مشخص میکنه و بدنه نداره یعنی فقط متد رو اجرا میکنه و به چگونگی انجامش کاری نداره...
یک کلاس abstract میتونه از یک کلاس abstract دیگه ارث بری داشته باشه

veniz2008
جمعه 04 مهر 1393, 18:17 عصر
interface شما نمی تویند فیلد یا پراپرتی داشته باشد


سلام.
در Interface هم میشه پراپرتی تعریف کرد (فقط در حد تعریف نه پیاده سازی).


کلاس abstract شده ارث بری نداره ولی interface اینطور نیست

همونطور که دوستان هم گفتن : کلاس abstract قابلیت نمونه سازی نداره ولی می تونه به ارث برده بشه و اساسا برای همین منظور هم ساخته شده که نشه ازش نمونه ساخت چون کلیات رو در بر می گیره و خودش یک کلاس و شی با معنی نیست که ازش نمونه ایجاد بشه.
موفق باشید.