فصل 6_ بخش ششم:ارث بری و چند ریختی ها (inheritance And polymorphisms)
Inheritance[ ارث بری ] :
در ارث بری به کلاس بالا دستی (کلاس پدر )کلید واژه (super)به کاربرده می شود و به فرزندان به اصطلاح (sub class) می گویند .
کاربرد ارث بری : هنگامی که می خواهیم یک کلاس تمام ویژگی ها و متد هایش به کلاس دیگر انتقال یابد می بایست کلید واژه open را قبل از تعریف کلاس اول
(کلاس پدر) بیاوریم و سپس جلوی کلاس فرزند علامت ' : ' را بیاوریم سپس اسم کلاس پدر رابیاوریم و سپس در ساده ترین حالت ممکن یک پرانتز باز و بسته بیاوریم . سپس بدنه کلاس فرزند را ایجاد کنیم .
اگر یک یا چند تا از subکلاس ها ویژگی دارند که با سایرین متفاوت است و این ویژگی متفاوت جز injection ها (خصوصیات )یا متد های کلاس پدر است می بایست یکی از این دو راه را طبق دانش فعلی خود انتخاب کنیم .
1_ یا به طور کلی این چند sub کلاس ها ویژگی متفاوت شان در خودشان پیاده سازی شود . و سایر sub کلاس ها فاقد آن شوند و چون از همان اول در متد پدر وجود نداشته .
2_ یا به طور کلی اگر تفاوت زیاد شد (( به خاطر رعایت کردن قانون [D.R.Y](Do'nt Repeed Yourself)که باعث می شود خطای برنامه نویسی کم شود )) از super کلاس دیگر ارث بری کنند .
کاربرد اصلی سطح دسترسی ' protecdet' در super کلاس می باشد و باعث می شود بتوانیم بدون اینکه در فایل main.kt آبجکتی (شی ای) بسازیم بتوانیم آن را فقط در کلاس های فرزندان استفاده کنیم .
به شکل های زیر با دقت نگاه کنید(شکل های شماره یک) :
Polymorphisms[ چند ریختی ها ]:
که به طور کلی به دو نوع است : 1_override و 2_ overload
ابتدا به نحوه پیاده سازی این دو اصطلاح که زیر مجموعه polymorphism ها هستند می پردازیم و سپس 5 تفاوت اصلی بین این دو را برایتان شرح می دهم :
override: در بین دو کلاس فرزند و والد اتفاق می افتد که اگر بخواهیم متد یا injection ای به صورت متفاوت در فرزندان اجرا شود . عین اسم متد با کلمه کلیدی fun قبل اش می اوریمو قبل کلمه fun که مخفف function است کلید واژه override را می اوریم . و قبل از همان متد مربوطه در والد کلید واژه open را می آوریم .(( و باید دقیقا با همان امضای تابع چه از نظر نوع پارامتر های ورودی و تعداد پارامتر های ورودی و چه از نظر نوع بازگشتی آن برابر متد والد باشد و تنها فرق آن که آن را متمایز می کند کد های داخل بدنه آن است .))
برای field injection هم می توانید عینا از val یا var استفاده شده در کلاس والد استفاده کنید و عینا از نام گذاری و نوع دیتا دادهای که در والد استفاده شده و فقط مقدار داده را تغییر دهید و همانند قسمت متد باقی قسمت ها را تکمیل کنید .
overload:در یک کلاس اتفاق می افتد و به این صورت است که چند متد با نام های یکسان ایجاد می کنیم و تنها تفاوت اجباری در آن ها باید نوع و تعداد پارامتر های ورودی باشد که در امضای تابع نوشته می شود . باشد تا حالت overload اتفاق بیفتد .
5 تفاوت اصلی override و overload :
1 _overload برای خوانایی بیشتر کد استفاده می شود ولی
override برای یک پیاده سازی خاص که در متد فرزند و والد وجود داشته می توان استفاده کرد .
2 _ overload داخل یک کلاس اتفاق می افتد ولی
override داخل دو کلاس اتفاق می افتد
3 _ هنگام overload کردن پارامتر ها باید دقیقا با هم متفاوت باشند(در امضای تابع ) ولی
در override کردن امضای تابع دقیقا باید با امضای تابع والد برابری کند .
4_ overload هنگام compile time اتفاق می افتد ولی
override در زمان run time اتفاق می افتد .
5 _ در overloadمقدار بازگشتی را تغییر دهیم هیچ اتفاقی نمی افتد ولی
در override حتی مقدار بازگشتی در امضای تابع مهم است و باید کاملا مطابق متد والد باشد .
به چند شکل زیر با دقت توجه کنید(شکل های شماره 2) :
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''