
آموزش اینترفیس ها در سی شارپ
آموزش اینترفیس ها در سی شارپ یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته ی آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه ی فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته ی آموزشی اینترفیس ها در سی شارپ است که با نام اصلی CSharp Interfaces از شرکت Pluralsight منتشر شده است.
اینترفیس چیست؟
اینترفیس ها در دات نت فایل هایی هستند که فقط حاوی تعاریف متدها، پروپرتی ها، رویدادها و ایندکسرها هستند. کلاس هایی که یک اینترفیس را پیاده سازی می کنند نیامند نوشتن کدهای مربوط به موارد تعریف شده در اینترفیس هستند. با استفاده از اینترفیس ها می توانید متدهایی که در اینترفیس های مختلف تعریف شده اند را در یک کلاس پیاده سازی کنید. در واقع وراثت چندگانه در دات نت با استفاده از اینترفیس ها قابل انجام است. علاوه بر این، به منظور شبیه سازی وراثت در Struct ها باید از اینترفیس ها استفاده کرد چرا که Struct ها نمی توانند از یک کلاس دیگر ارث بری کنند.
در مثال زیر، تعریف یک اینترفیس و پیاده سازی آن توسط یک کلاس را مشاهده می کنید.

interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
void SampleMethod()
{
// Method implementation.
}
}
کاربرد اینترفیس ها چیست؟
کاربردهای بسیاری برای Interface ها وجود دارد. یکی از مهم ترین آنها Loosely Coupled شدن قسمت های مختلف برنامه است. توصیه می کنیم که مقاله بررسی مفاهیم Cohesion و Coupling در توسعه نرم افزار را مطالعه کنید. علاوه بر این، در پیاده سازی بسیاری از الگوهای طراحی از اینترفیس ها استفاده می شود. تصویر زیر پیاده سازی الگوی طراحی Adapter را با استفاده از اینترفیس ها نشان می دهد.
تفاوت Interface و Abstract Class در سی شارپ چیست؟
در C#، Interface و Abstract Class هر دو میتوانند برای تعریف قراردادها و ایجاد ساختار مشترک میان کلاسها استفاده شوند، اما کاربرد آنها یکسان نیست. Interface مشخص میکند یک نوع چه اعضایی را در اختیار قرار میدهد، در حالی که Abstract Class علاوه بر تعریف اعضای انتزاعی میتواند پیادهسازی مشترک و وضعیت داخلی نیز داشته باشد. برای مثال، چند کلاس مستقل میتوانند یک Interface مشترک را پیادهسازی کنند، بدون اینکه مجبور باشند از یک کلاس پایه واحد ارثبری کنند.
یکی از تفاوتهای مهم این دو مفهوم، نحوه ترکیب آنها در طراحی برنامه است. یک کلاس در C# میتواند چند Interface را پیادهسازی کند، اما فقط از یک کلاس پایه ارثبری میکند. بنابراین، Interface برای تعریف قابلیتهایی که انواع مختلف باید ارائه دهند، انتخاب مناسبی است؛ در حالی که Abstract Class زمانی مفید است که علاوه بر قرارداد، رفتار یا داده مشترکی نیز وجود داشته باشد. انتخاب درست میان این دو روش به نیازهای طراحی و میزان اشتراک واقعی میان کلاسها بستگی دارد.
چگونه با Interface کد قابلگسترش در C# بنویسیم؟
یکی از کاربردهای مهم Interface، فراهم کردن امکان افزودن پیادهسازیهای جدید بدون نیاز به تغییر گسترده در کدهای موجود است. برای مثال، اگر برنامه از یک Interface برای ارسال اعلان استفاده کند، میتوان پیادهسازیهای متفاوتی برای روشهای مختلف ارسال ایجاد کرد. بخش اصلی برنامه بهجای وابستگی مستقیم به یک کلاس مشخص، با قرارداد مشترک کار میکند. در نتیجه، افزودن یک روش جدید میتواند بدون بازنویسی منطق اصلی مصرفکننده انجام شود، به شرط آنکه پیادهسازی جدید همان قرارداد را رعایت کند.
این رویکرد بهویژه در برنامههایی اهمیت دارد که نیازمندیهای آنها در طول زمان تغییر میکنند. استفاده از Interface میتواند وابستگی مستقیم میان اجزای برنامه را کاهش دهد و آزمایش بخشهای مختلف را سادهتر کند. برای مثال، هنگام آزمایش یک سرویس میتوان پیادهسازی واقعی وابستگی را با یک نمونه آزمایشی جایگزین کرد. البته طراحی Interfaceهای مناسب نیازمند شناخت مسئولیت هر بخش است؛ قراردادهای بیش از حد گسترده یا تغییرات ناسازگار در آنها میتوانند نگهداری برنامه را دشوار کنند.
پیادهسازی Explicit Interface در سی شارپ چه زمانی کاربرد دارد؟
در C#، یک کلاس میتواند چند Interface را پیادهسازی کند، حتی اگر برخی از آنها اعضایی با نام یکسان داشته باشند. در چنین شرایطی، Explicit Interface Implementation امکان میدهد پیادهسازی هر عضو بهطور مشخص به Interface مربوط به خودش وابسته باشد. برای مثال، اگر دو Interface هر دو متدی با نام یکسان تعریف کنند اما رفتار موردنیاز آنها متفاوت باشد، کلاس میتواند هر دو نسخه را جداگانه پیادهسازی کند و از ابهام در تعریف اعضا جلوگیری کند.
یکی دیگر از ویژگیهای این روش آن است که اعضای پیادهسازیشده بهصورت Explicit معمولاً از طریق خود نمونه کلاس قابلدسترسی مستقیم نیستند و باید از طریق مرجع Interface مربوطه فراخوانی شوند. این موضوع میتواند سطح دسترسی اعضا را در قراردادهای مختلف کنترلپذیرتر کند. با این حال، استفاده از این روش باید زمانی انجام شود که واقعاً به جداسازی پیادهسازیها یا مدیریت تعارض اعضا نیاز دارید. در غیر این صورت، پیادهسازی معمول Interface اغلب خواناتر و سادهتر خواهد بود.
نقش Interface در Dynamic Loading و معماری افزونهها
Dynamic Loading به معنای بارگذاری اسمبلیها یا اجزای برنامه در زمان اجراست، بهجای اینکه تمام پیادهسازیها از ابتدا بهصورت ثابت در برنامه مشخص باشند. Interface میتواند قرارداد مشترکی برای این اجزا تعریف کند تا برنامه اصلی پس از بارگذاری یک پیادهسازی، از طریق همان قرارداد با آن ارتباط برقرار کند. برای مثال، یک برنامه میتواند افزونههایی را بارگذاری کند که همگی یک Interface مشخص را پیادهسازی کردهاند و قابلیتهای جدیدی به سیستم اضافه میکنند.
در چنین معماریای، برنامه اصلی لازم نیست به جزئیات داخلی تمام افزونهها وابسته باشد؛ کافی است قرارداد مورد انتظار را بشناسد و بتواند پیادهسازی سازگار را پیدا و استفاده کند. البته Dynamic Loading به مدیریت اسمبلیها، نسخهها، وابستگیها و خطاهای احتمالی هنگام بارگذاری نیاز دارد. طراحی مناسب Interfaceها در این شرایط اهمیت زیادی دارد، زیرا تغییر ناسازگار در قرارداد ممکن است بر افزونههای موجود تأثیر بگذارد. این مفاهیم برای توسعهدهندگانی مفید هستند که به ساخت برنامههای قابلگسترش در اکوسیستم دات نت علاقه دارند.
سرفصل مطالب آموزش ویدئویی اینترفیس ها در سی شارپ
فصل اول: اینترفیس ها و کلاس های Abstract و کلاس های Concrete
- مقدمه ی دوره ی آموزشی
- نگاه کلی به بحث اینترفیس ها
- تعاریف
- پیاده سازی عملی یک کلاس Concrete
- پیاده سازی عملی یک کلاس Abstract
- پیاده سازی عملی یک اینترفیس
- مقایسه ی اینترفیس ها و کلاس های Abstract
فصل دوم: استفاده از اینترفیس ها برای Future Proof کردن کد
- مقدمه
- برنامه نویسی به سمت انتزاع (Abstraction)
- پیاده سازی عملی یک کد با کلاس های Abstract و اینترفیس ها
فصل سوم: ساختن اینترفیس ها برای افزودن Extensibility
- مقدمه
- الگوی طراحی Repository
- پیاده سازی یک Service Repository
- کار با Repository های SQL و CSV
- حذف Duplication
فصل چهارم: پیاده سازی Explicit اینترفیس ها
- مقدمه
- پیاده سازی صریح (Explicit Implementation) اینترفیس ها
- چه زمانی پیاده سازی صریح مورد نیاز است؟
- وراثت و اینترفیس ها
فصل پنجم: اینترفیس ها و Dynamic Loading
- مقدمه
- برنامه نویسی صرف به سمت اینترفیس ها
- بحث لود کردن پویا
- Unit Testing
- بحث مربوط به Layering و Fake Repository
- پیاده سازی عملی Unit Testing
فصل ششم: مباحث پیشرفته
- مقدمه
- اصل Interface Segregation (شکستن اینترفیس)
- مقایسه ی اینترفیس ها و کلاس های Abstract
- به روز رسانی اینترفیس های موجود
- مبحث Dependency Injection
- مبحث Mocking







