آموزش دونه:مرجع آموزش

اینترفیس در کاتلین (Kotlin interface ) آموزش برنامه نویسی کاتلین kotlin

اینترفیس

kotlin interface

اینترفیس یک موجودیت مهم در برنامه‌نویسی شی‌گراست که هم می‌تواند حاوی تعریف متدهای انتزاعی (Abstract) و هم پیاده‌سازی متدهای غیرانتزاعی باشد ولی نمی‌تواند هیچ نوع حالتی را درون خود ذخیره کند. اینترفیس می‌تواند حاوی پراپرتی نیز باشد ولی با این شرط که انتزاعی تعریف شود یا پیاده‌سازی هم داشته باشد. به صورت کلی ساختار اینترفیس در کاتلین مشابه جاوا ۸ است و تفاوت چندانی وجود ندارد. کلاس‌های انتزاعی در کاتلین چیزی شبیه اینترفیس هستند ولی تفاوت ظریفی با آن دارند. در کلاس‌های انتزاعی، اجباری به انتزاعی بودن پراپرتی‌ها یا پیاده‌سازی آن‌ها نیست ولی در اینترفیس این اجبار وجود دارد.

روش تعریف اینترفیس در کاتلین

با کلیدواژه interface می‌توانید این کار را انجام دهید. اگر دقت کنید تفاوت زیادی با تعریف کلاس ندارد:

نکاتی قابل ملاحظه:

  • MyInterface حاوی پراپرتی test و متد ()foo است که هر دو انتزاعی هستند؛
  • این اینترفیس همچنین متدی غیرانتزاعی تحت عنوان ()hello دارد.

روش پیاده‌سازی اینترفیس

خب حالا می‌خواهیم ببینیم این اینترفیسی که ایجاد کرده‌ایم را چطور باید پیاده‌سازی کنیم:

در مثال فوق، کلاس InterfaceImp در واقع اینترفیس MyInterface را پیاده‌سازی کرده که در آن اعضای انتزاعی اینترفیس (متد ()foo و پراپرتی test رونویسی شده‌اند.

طرز کار اینترفیس

خروجی:

همانطور که پیشتر نیز گفتم، اینترفیس می‌تواند حاوی پراپرتی باشد البته به این شرط که پیاده‌سازی هم داشته باشد:

خروجی:

در مثال بالا پراپرتی prop انتزاعی نیست ولی چون داخل اینترفیس پیاده‌سازی آن موجود است مشکلی ندارد. ولی توجه کنید که داخل اینترفیس چیزی مثل val prop: Int=23 نمی‌توانید استفاده کنید.

پیاده‌سازی دو یا چند اینترفیس داخل کلاس

اگرچه در کاتلین امکان ارث‌بری چندگانه کلاس‌ها نیست ولی چنین محدودیتی برای اینترفیس‌ها وجود ندارد. یک کلاس می‌تواند دو یا چندین اینترفیس مختلف را پیاده‌سازی کند:

خروجی:

حل مشکل تداخل در ارث‌بری چندگانه اینترفیس‌ها

فرض کنید دو اینترفیس A و B دارای متد غیرانتزاعی مشابهی تحت عنوان ()callMe باشند. شما این دو اینترفیس را در کلاس C پیاده‌سازی می‌کنید. حالا وقتی ()callMe را روی شی ایجاد شده از کلاس C صدا می‌زنید کدام نسخه فراخوانی می‌شود؟ بله کامپایلر هم سردرگم می‌شود و خطا می‌دهد. مثال:

خروجی:

برای حل مشکل، باید خودتان پیاده‌سازی مخصوصی از این تابع داشته باشید:

حالا که برنامه را اجرا می‌کنید خروجی به این صورت خواهد بود:

این پیاده‌سازی صریحی است که در کلاس C انجام شده است:

عبارت ()super<A>.callMe متد ()callMe را از کلاس A فرخوانی می‌کند. ()super<B>.callMe متد ()callMe که متعلق به کلاس B است را فرخوانی می‌کند.

kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface kotlin interface 

مطالب مرتبط