بسیار خب.
پس ما سه مورد از پنج کاربرد اینترفیس‌ها (Interfaces) رو دیدیم.
اول برای ترویج قابلیت استفاده مجدد (reusability) و انعطاف‌پذیری (flexibility) کد، بعد جدا کردن کد (decoupling code) و افزایش قابلیت تست (testability).
و توی چند ویدیوی اخیر، دیپندِنسی اینجِکشِن (dependency injection) رو بررسی کردیم، که باید بگم موضوع نسبتاً مفصلی بود.
اما مورد شماره چهار رو قراره بعداً با یانیک پوشش بدیم.
و مورد شماره پنج چیزیه که می‌خوام تو این ویدیو دربارش صحبت کنم.
یعنی دستیابی به وراثت چندگانه (Multiple Inheritance).
خب، کجا باید از وراثت چندگانه استفاده کنیم؟ وقتی که نیاز داریم یک کلاس چندین قابلیت (functionalities) رو پیاده‌سازی کنه،
اوکی؟
و چرا باید این کار رو بکنیم؟
خب، برای اینکه به یک کلاس اجازه بدیم با چندین قرداد (contracts) انطباق پیدا کنه و کِی؟
خب، تو مثال ما، تو یک دستگاه چندمنظوره کامل که هم می‌تونه پرینت بگیره و هم اسکن کنه.
پس قراره یک نرم‌افزار کوچیک بسازیم که به ما اجازه بده پرینت و اسکن انجام بدیم.
این بهمون نشون می‌ده که چطور مفهوم وراثت چندگانه (multi inheritance) یا (multiple inheritance) می‌تونه در سی شارپ (C#)
با یک راه‌حل موقتی (workaround) از طریق اینترفیس‌ها، محقق بشه.
درسته؟
خب، ما دیدیم که نمی‌تونیم هم‌زمان از دو کلاس ارث‌بری کنیم، اما می‌تونیم هم‌زمان از چندین اینترفیس ارث‌بری کنیم.
خب.
پس بیاید ببینیم این چطور کار می‌کنه.
خب، بیاید بسازیمش.
بنابراین من یک public interface به اسم IPrintable خواهم داشت.
و بعد اون فقط پرینت می‌گیره، اوکی؟
کار دیگه‌ای انجام نمی‌ده.
و بعد یک public interface دیگه دارم که IScannable خواهد بود و اون اسکن می‌کنه: void scan، اوکی؟
و بعد یک کلاس دیگه دارم که یک پرینتر چندمنظوره (multi-function printer) خواهد بود، اوکی؟
پس public class MultiFunctionPrinter که اینترفیس IPrintable و اینترفیس IScannable رو پیاده‌سازی می‌کنه.
خب.
و این فقط یک مثال هست، چون پتانسیل پیاده‌سازی کلی اینترفیس بیشتر رو هم داره.
پس من فقط برای ساده‌سازی از دو تا استفاده می‌کنم.
و اینجا تو این کلاس، تو MultiFunctionPrinter، جاییه که من می‌خوام بگم چطور واقعاً پرینت می‌گیرم
و چطور واقعاً اسکن می‌کنم.
چون حالا این پرینتر داره ارث‌بری می‌کنه، به اصطلاح.
نه واقعاً، اما داره چندین اینترفیس رو پیاده‌سازی می‌کنه.
پس داره تا حدی وراثت چندگانه انجام می‌ده.
پس اینجا حالا می‌تونم بگم که پیاده‌سازی متد پرینت من چطور باید باشه و پیاده‌سازی
متد اسکن من چطور باید باشه.
اوکی.
و حالا مثلاً اینجا فقط می‌گیم: "در حال اسکن سند".
و تو دستور پرینت، فقط می‌گیم: "در حال چاپ سند".
بسیار خب.
پس حالا بریم جلو و از این تو برنامه‌مون استفاده کنیم.
و بنابراین من یک آبجکت از MultiFunctionPrinter خودم ایجاد می‌کنم که اسمش رو می‌ذارم printer.
و از این printer برای پرینت گرفتن استفاده می‌کنم.
و بعد از این printer برای اسکن کردن استفاده می‌کنم.
بفرمایید.
خب حالا این رو اجرا می‌کنیم و می‌بینیم که می‌گه: "در حال چاپ سند"، "در حال اسکن سند".
پس این یک مثال ساده بود از اینکه چطور می‌شه به وراثت چندگانه دست پیدا کرد.
چون این کلاس MultiFunctionPrinter حالا IPrintable و IScannable رو پیاده‌سازی می‌کنه.
پس هر دوی این اینترفیس‌ها. خب تو مثال ما این اینترفیس‌ها فقط یک متد ساده دارند.
اما می‌تونستند یک عالمه پراپرتی (property) و متدهای زیاد هم داشته باشند.
همین موضوع برای اینترفیس IScannable هم صدق می‌کنه.
فقط یک متد داره، اما می‌تونست خیلی بیشتر داشته باشه.
خب حالا شما ممکنه بگید، مشخصه، می‌تونستید یک کلاس Printer هم بسازید که تمام کارهایی که پرینتر انجام می‌ده رو انجام بده،
اما از نظر معماری (architecture) کار رو خیلی سخت‌تر می‌کرد، چون فرض کنید
بعداً می‌خواید یک پرینتر داشته باشید که فقط بتونه پرینت بگیره و اسکن نکنه، در اون صورت،
تمام این بار اضافی (overhead) رو خواهید داشت، و اینجا هست که این اینترفیس‌ها به درد می‌خورند.
اوکی؟
خب، چیز باحال تو این مورد اینه که ما حالا انعطاف‌پذیری داریم، چون این MultiFunctionPrinter
حالا می‌تونه هر زمانی که به یک آبجکت IPrintable نیاز داریم، یا هر زمانی که به یک آبجکت IScannable
نیاز داریم، استفاده بشه، چون اون، به اصطلاح، از هر دو ارث‌بری می‌کنه.
پس اون داره هر دو رو پیاده‌سازی می‌کنه، و بنابراین می‌تونیم ازش طوری استفاده کنیم که انگار یک آبجکت IPrintable هست که
مثل یک آبجکت IPrintable رفتار می‌کنه.
و بعضی وقت‌ها می‌تونه مثل یک آبجکت IScannable رفتار کنه، بسته به اینکه کجا بهش نیاز دارید و چطور
می‌خواید ازش استفاده کنید.
درسته؟
پس اینجا هست که دوباره چندریختی (polymorphism) وارد عمل می‌شه و امثال اون.
اما به طور کلی، این روشی هست که می‌تونید وراثت چندگانه رو در سی شارپ پیاده‌سازی کنید.