
آموزش گام به گام #C (جلسه سیزدهم: واسطها یا Interfaceها)
اگر زمانی نیاز به چندین ارثبری تو در تو داشتید و این نیاز باعث میشد که کد شما پیچیده و تریس کردن آن مشکل شود آیا از این نیاز صرف نظر میکردید یا سختی آن را به جان میخریدید و آن را پیادهسازی میکردید؟ نگران نباشید. واسطها به کمک شما میآیند. با ما همراه باشید!
جلسه اول: آغاز کار با #C | جلسه ششم: namespaceها | جلسه یازدهم: اندیس گذار یا indexerها | جلسه شانزدهم: استفاده از اتریبیوتها | جلسه بیست و یکم: متدهای بینام یا anonymous |
جلسه دوم: عملگرها، نوعها و متغیرها | جلسه هفتم: مقدمهای بر کلاسهای #C | جلسه دوازدهم: ساختار یا structها | جلسه هفدهم: enumها | جلسه بیست و دوم: موضوعاتی در مورد نوع در #C |
جلسه سوم: عبارات کنترلی - گزینشی | جلسه هشتم: وراثت کلاس در #C | جلسه سیزدهم: واسط یا interfaceها | جلسه هجدهم: عملگرهای overloading | جلسه بیست و سوم: کار با نوعهای nullable |
جلسه چهارم: عبارات کنترلی - حلقهها | جلسه نهم: چندریختی | جلسه چهاردهم: مقدمهای بر delegateها و رویدادها | جلسه نوزدهم: کپسولهسازی | |
جلسه پنجم: متدها | جلسه دهم: ویژگی یا propertyها | جلسه پانزدهم: مقدمهای بر کنترل خطا یا exception | جلسه بیستم: مقدمهای بر generic collectionها |
در این جلسه در مورد واسطهای #C صحبت خواهیم کرد. اهداف این جلسه به شرح زیر میباشند:
- درک هدف واسطها.
- تعریف یک واسط.
- استفاده از یک واسط.
- پیادهسازی ارثبری واسط.
واسط شبیه به یک کلاس است، اما پیادهسازی ندارد. تنها چیزی که واسط دارد، تعاریفی از رویدادها، indexerها، متدها و/یا Propertyها هستند.
دلیل اینکه واسطها فقط تعریف ارائه میدهند، این است که آنها توسط کلاسها و structها ارثبری میشوند و کلاسها و Structها هستند که باید برای هر عضو تعریف شده در واسط ، پیادهسازی فراهم کنند.
بنابراین، اگر واسطها هیچ تابعی را پیادهسازی نمیکنند، پس به چه دردی میخورند؟ آنها برای سر هم کردن روشهای Plug and Play (مثل معماریهایی که اجزای آنها میتوانند در هر زمانی تغییر کنند)عالی هستند.
چون همه اجزای قابل تغییر، یک واسط یکسان را پیادهسازی میکنند، میتوان از آنها بدون هیچ برنامهنویسی یا کد نویسی اضافهای استفاده کرد.
واسط هر جزء را مجبور میکند تا اعضای عمومی خاص که به روش خاصی مورد استفاده قرار میگیرند را نمایش دهد.
چون واسطها باید توسط کلاسها و structهای مشتق گرفته شده پیادهسازی شوند، پس یک قرارداد (contract) تعریف میکنند.
برای مثال، اگر کلاس foo، واسط IDisposable را پیادهسازی کند، در واقع قطعه کدی ایجاد میکند که این قطعه کد قطعا دارای متد ()Dispose است و این متد تنها عضو واسط IDisposable میباشد.
هر قطعه کدی که بخواهد از کلاس foo استفاده کند، باید بررسی کند تا ببیند آیا کلاس foo واسط IDisposable را پیادهسازی کرده است یا خیر. اگر نتیجه بررسی true باشد، آنگاه کد میداند که میتواند ()foo.Dispose را فراخوانی کند. لیست ۱-۱۳ چگونگی تعریف یک واسط را نشان میدهد:
لیست ۱-۱۳. تعریف یک واسط: MyInterface.cs
لیست ۱-۱۳ واسطی به نام IMyInterface را تعریف میکند. مرسوم است که در نامگذاری واسطها قبل از نام اصلی واسط یک حرف “I” بزرگ مینویسند. این واسط دارای یک متد به نام ()MethodToImplement میباشد.
متد واسط میتواند هر نوع تعریف متد با پارامترها و انواع بازگشتی مختلف باشد.
این دفعه من متد را بدون پارامتر و با یک نوع بازگشتی void تعریف کردم تا یک مثال ساده ارائه دهم. توجه کنید که این متد دارای پیادهسازی نیست(یعنی دستورات بین آکولادها وجود ندارند)، اما در عوض با یک سمی کالن “;” پایان مییابد.
این بدان خاطر است که واسطها تنها دارای امضای متدهایی هستند، که این متدها باید توسط کلاس یا Struct فرزند پیادهسازی شوند. لیست ۲-۱۳ چگونگی استفاده از این واسط را نشان میدهد.
لیست ۲-۱۳. استفاده از یک واسط: InterfaceImplementer.cs
کلاس InterfaceImplementer در لیست ۲-۱۳ واسط IMyInterface را پیادهسازی میکند. این لیست نشان میدهد که ارثبری یک کلاس از یک واسط، درست مشابه و همانند با ارثبری از یک کلاس دیگر است. در این کلاس، syntax زیر مورد استفاده قرار گرفته است:
حالا که کلاس از واسط IMyInterface ارثبری میکند، باید اعضایش را نیز پیادهسازی کند. کلاس این کار را با پیادهسازی متد ()MethodToImplement انجام میدهد.
توجه کنید که این پیادهسازی متد دقیقا دارای همان امضا، پارامترها و نام متد یکسان با آنهایی است که در واسط IMyInterface تعریف شدهاند.
هر گونه تفاوت بین امضای متد در واسط و امضای متد در کلاس یا Struct پیادهسازی، باعث بروز یک ارور کامپایلر میشود. علاوه بر این، struct یا کلاسی که از یک واسط ارثبری میکند، باید شامل تمام اعضای واسط باشد.
اگر همه اعضای واسط را پیادهسازی نکنید، ارور کامپایلر دریافت خواهید کرد.
واسطها همچنین میتوانند از واسطهای دیگر نیز ارثبری کنند. لیست ۳-۱۳ چگونگی پیادهسازی واسطهای ارثبری شده را نشان میدهد.
لیست ۳-۱۳. ارثبری از واسط: InterfaceInheritance.cs
کد موجود در لیست ۳-۱۳ شامل دو واسط است: واسط IMyInterface و واسطی که از آن ارثبری میشود (یعنی واسط IParentInterface).
وقتی یک واسط از یک واسط دیگر ارثبری میکند، هر کلاس یا instruct پیادهسازی باید همه اعضای موجود در کل زنجیره ارثبری واسط را نیز پیادهسازی کند.
چون کلاس InterfaceImplementer در لیست ۳-۱۳ از واسط IMyInterface ارثبری میکند، همچنین از واسط IParentInterface نیز ارثبری میکند.
از این رو، کلاس InterfaceImplementer باید متد ()MethodToImplement که در واسط IMyInterface تعریف شده و متد ()ParentInterfaceMethod که در واسط IParentInterface تعریف شده را نیز پیادهسازی کند.
خلاصه
حالا میدانید که واسطها چه هستند. میتوانید یک واسط را پیادهسازی کنید و از آن در یک کلاس استفاده کنید.
واسطها همچنین میتوانند توسط واسطهای دیگر ارثبری شوند. هر کلاس یا instruct که از یک واسط ارثبری میکند باید همچنین تمام اعضای موجود در کل زنجیره ارثبری واسط را نیز پیادهسازی کند.
منبع: C#-Station
جلسه بعد جلسه قبل
آخرین مطالب

دستور UPDATE در SQL Server برای تغییر دادههای موجود در یک جدول، از دستور UPDATE به شکل زیر استفاده ...

دستور DROP TABLE در SQL Server گاهی، لازم است یک جدول که دیگر استفادهای ندارد را حذف کنید. برای ...

بخش اول از آخرین مبحث دوره جامع آموزش SQL Server در جلسه قبلی بررسی شد. این مبحث که ...
دیدگاه خود را درباره این پست بنویسید