مفهومinterface و کلاس abstract در سی شارپ

سوال

سلام به دوستان عزیز من چند وقته دارم راجب مفاهیم شی گرایی میخونم.

الان بعضی از مفاهیمش رو بلدم ! اما مفاهیم abstract  و اینترفیس  برام گنگه!!!

اگه ممکنه برام توضیح بدید که :
۱-هرکدوم چی هست
۲-اینکه موارد استفاده هرکدوم چطوریه!
۳-همچنین تفاوت هاش!

۴-چه زمان از abstract استفاده کنم چه زمان از interface

ممنون میشم منو راهنمایی کنید.

حل شده 0
Sahand 5 سال 6 پاسخ ها 2727 دیده شده 0

پاسخ ها ( ۶ )

  1. اینترفیسها شبیه کلاس هستند ولی کلاس نیستند.آنها صددرصد انتزاعی هستند و اینکه در آنها اجازه نداریم که نوع دسترسی را مشخص کنیم و همچنین اجازه تعریف یک فیلد را نداریم فقط میتوایم صفت ها و متد های بدون بدنه در آنها تعریف کنیم و اینکه میتوانیم به کمک اینترفیسها  یک کلاس را فرزند چندتا اینترفیس کنیم

    ولی در abstract ها ما صددرصد انتزاعی نداریم میتوانیم قسمتی از کلاس را انتزاعی کنیم و اینکه abstract ها یک کلاس هستند.

    و اینکه از هردو نمیتوانیم یک نمونه تعریف کنیم

     

     

  2. ما باید یک استاندارد در نظر بگیریم و آن متد هایی که لازم است با اسم های خاص در کلاس Abstract در نظر بگیریم مثلاً متد Insert، Update، Delete داشته باشیم و این کلاس Abstract را به آن سه تا برنامه نویس می دهیم همه ی برنامه نویسان موظف هستند که آن متدها را با آن نام ها در نظر بگیرید و پیاده کنند و همه هم موظف هستند که همه ی آن متدها را پیاده سازی کنند نه این که یکی از متدها را فراموش کنند

  3. سلام دوست عزیزم

    قدم ب قدم جلو میریم

    Interface : اینترفیس یک استخوان بندی ثابت و قوانین برای کلاس ما درست میکند در اینترفیس ما میتوانیم فقط یکسری اعضا مانند (متدها،event ها، پروپرتی ها و ایندکسرها)   تعریف کنیم که و قانون اینترفیس این است که تمام اعضا باید کاملا انتزاعی باشند .

    ذات اینترفیس جنریک بودن آن است.و هرکلاسی میتواند آن را پیاده سازی کند بدون آنکه آسیب پذیری به آن کلاس وارد کند.

    می دانیم که در زبان های شی گرا مفهوم وراثت چندگانه حذف شده و بجای آن پیاده سازی چندگانه جایگزین شده.

    یعنی کلاس ها میتوانند بی نهاییت اینترفیس را پیاده سازی کنند. و خود اینترفیس نیز می تواند بی نهایت اینترفیس را به ارث ببرد.

    نکته ها :

    *اینترفیس کلاس نیست و ماهیت کلاس ندارد!

    *اینترفیس ها سازنده ندارند!

    *اینترفیس ها فیلد ندارند!

    *نمی توان از اینترفیس ها نمونه سازی کرد.

    *در اینترفیس سطوح دسترسی معنا ندارند و همگی به صورت پیش فرض public هستند.

    *در اینترفیس های Loose Coupling به شدت احساس می شود.

     

     

    کلاس های Abstract یا کلاس های تجریدی

    به جرئت میتوان گفت کلاس های تجرید بسیارقدرتمند و بسیار پرکاربرد هستند.این کلاس ها بیشتر به Base Class ها معروف هستند.و برای این منظور بسیار مورد استفاده قرار میگیرند که برای ما میتوانند نقش یک کلاس پدر را بازی کند که بسیار قدرتمنداست چون:

    *ماهیت کلاس دارد.

    *اعضای abstract دارد.

    *اعضای غیر abstract دارد.

    *از تمام امکانات کلاس عادی می تواند استفاده کند

    *فقط برای وراثت استفاده میشود و از آن نمیتوان نمونه سازی کرد.

    *یک کلاس abstract همان اینترفیس است اما بسیار گسترده تر و قدرتمند تر

    *اصولا به کلاس های abstract کلاس های نیمه کاره گویند چون با فرزندانش تکمیل تر می شود.

     

    کلاس ها میتوانند فقط از یک کلاس ابسترکت ارث بری کنند.اما همان کلاس ها می توانند بی نهایت اینترفیس را پیاده سازی کنند.(یادمان نرود که کلاس ابسترکت نیز کلاس است و خود نیز میتواند بی نهایت اینترفیس را پیاده سازی کند)

     

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

     

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

    * زمانی که بخواهیم تمام متدهای معرفی شده در کلاس Base Class به طور کامل در کلاس های فرزندان  پیاده سازی شوند باید از Interface ها استفاده کنیم.

     

    به طور کلی یک Interface چارچوب و قابلیتهای یک کلاس را مشخص میکند و یک قرارداد است ولی کلاسهای Abstract نوع کلاس را مشخص میکند (به این معنا که چون کلاس های ابسترکت معمولا کلاس پایه هستند در نتیجه مشخص کننده کلاس های زیر ربط هست)

     

     

    یادگیری دوره آموزش سی شارپ به صورت رایگان

    بهترین پاسخ
  4. باسلام دوست عزیز.

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

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

     

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

     

    و اما چند نمونه از تفاوت های interface و کلاس های Abstract:

    1. یک کلاس معمولی صرفا می تونه از یک کلاس Abstract ارث بری کنه در حالی که همون کلاس می تونه از چندین interface ارث بری کنه.
    2. یک interface تنها می تواند یک قالب برای یک کلاس را تعیین کند در حالی که یک کلاس Abstract علاوه بر این مورد، می تواند برای هر یک از متد ها و یا توابع، خصوصیاتی را کد زنی کند.
    3. موارد موجود در یک کلاس Abstract می تونن مثل یک کلاس معمولی، دارای سطح دسترسی باشند در حالی که در interface ها چنین قابلیتی وجود ندارد.
    4. اگر شما تغییری در یک کلاس Abstract اعمال کنید ( به طور مثال یک متد اضافه کنید ) به صورت خودکار به تمامی کلاس های زیر مجموعه اعمال و اضافه می شود در حالی که در interface ها باید تک تک کلاس ها را باز کنید و موارد اضافه شده رو به کلاسی که ارث می برد اضافه کنید.
    5. و …
  5. سلام

    ارث بردن از یک کلاس، مکانیزم قدرتمندی است اما قدرت واقعی وراثت از ارث بردن از یک Interface می آید. Interface ها دلیل اصلی وجود وراثت هستند. یک Interface به شما امکان می دهد تا اسم متد را کاملا از پیاده سازی آن جدا کنید. Interface  به شما می گوید که اسم متد چیست. این که متد چگونه پیاده سازی شود به Interface مربوط نیست. 

    از کلاس abstract در سی شارپ نمی توان شیء ایجاد کرد. همچنین متدی که داخل این کلاس ها تعریف می شوند اگر بصورت abstract تعریف شوند نمی توان بدنه ای برای آنها تعریف کرد به این معنی که متدها بدون رفتار خواهند بود.از این کلاس فقط ارث بری مجاز است و برای تعریف رفتار به متدهای آن از طریق کلمه کلیدی Override قابل انجام است.

  6. سلام خدمت شما دوست عزیز، اگه تمایل داشتید پیشنهاد من به شما اینه که حتما دوره آموزش سی شارپ را مشاهده کنید امیدوارم مشکلتون برطرف بشه.

ارسال یک پاسخ