همانطور که قبلا گفته شد مفهوم abstract همان black box است که بدین معنا است که هرچه درصد abstract ما از محیط اطراف بیشتر باشد نشان دهنده دانش کمتر ما نسبت به آن هاست و ما صرفا استفاده کننده یا نگهدارنده آن ها هستیم .

وقتی پشت یک class کلید واژه abstract استفاده می کنیم یعنی ما آن کلاس را می توانیم بین 0 تا 100 درصد به آن مفهوم black box دهیم .یعنی با استفاده از آوردن کلید واژه abstract پشت تعریف method ها و انواع injection هایمان می توانیم مقدار دهی یا بدنه method ها را به کلاس های فرزند الحاق کنیم یا خودمان مستقیما پیاده سازی را انجام دهیم(بدون آوردن کلید واژه abstract) و اگر در فرزندی پیاده سازی متفاوت بود قبل از ان کلید واژه open به کار ببریم .

در واقع فرق کلید واژه abstract قبل از متد ها و injection ها با کلید واژه open در این نوع کلاس ها (Abstract classes)در این است که کلید واژه اولی override کردن را برای کلاس های فرزند اجباری می کند و در صورت عدم override با خطای کامپایلری مواجه می شویم اما کلید واژه دومی (open)از polymorphismهای اختیاری است که از نوع overrideاست در فرزندان .

بدین ترتیب در abstract class ها می توانیم بدون هیچ پیاده سازی black box 100% یا با درصدی پیاده سازی black box 100% .. 0% داشته باشیم .

نکته: abstract class ها و class های عادی دو نوع ارث بری را می توانند داشته باشند :

1_ ارث بری تکی یعنی فقط به یک class ساده دیگر ارث بری کنند .(البته abstract class می تواند از نوع خودش هم ارث بری تکی داشته باشد )

2_ارث بری چند مرحله ای یعنی کلاس ها از هم به ترتیب از بالا به پایین ارث بری کنند .

نکته :قابل توجه است که از یک کلاس یا Abstractکلاس می توان چند کلاس یا Abstractکلاس ارث بری کنند .(به بیان ساده یک والد می تواند (چند فرزند داشته باشد )

نکته :ارث بری از بیش از یک والد بدون استفاده از intreface ها غیر ممکن است.

Interface ها این امکان را برایمان فراهم می کنند تا دید black box 100% را داشته باشیم .

اما در زبان کاتلین این امکان فراهم شده تا یک پیاده سازی جزیی هم در interface ها داشته باشیم (در صورت دلخواه).

نکته:interface ها فاقد سازنده یا همان constructor هستند .بنابراین هنگام ارث بری نباید پرانتز باز و بسته بعد از اسم interface بگذاریم .

نکته :تمامی فانکشن ها و فیلد injection های مربوط به intreface ها به طور پیش فرض abstract هستند و نیازی به گذاشتن این کلید واژه نیست .

نکته : هنگامی که چند interface و یک abstract کلاس می سازیم می توانیم سه راهکار داشته باشیم یا همه را به یک abstract class کلاس ارث بری کنیم که اجباری به override نمودن متد ها و فیلد هایمان که abstract بودند نداریم .ولی درصورت دلخواه می توانیم این کار را انجام دهیم .

یا همه را به یک interface ارث بری می کنیم که در این صورت به طور معمول اصلا نمی خواهیم override انجام دهیم .

یا همه را به یک کلاس معمولی ارث بری می کنیم که در این صورت با نگه داشتن control و Alt و زدن دکمه Enter یک صفحه برایمان باز می شود که لیست متد ها و فیلد injection ها را برایمان می اورد و با نگه داشتن دکمه control و A باعث می شود کل ان ها انتخاب شود و بازدن دکمه Enter کل متد ها و injection ها به طور پیش فرض تعریف می شوند و فقط کافی است مقادیر را در injection ها جایگزین و بدنه متد هایمان را بنویسیم .

حالا از شما می خواهم طبق توضیحات زیر و با توجه به مطالبی که تا حالا در فصل 6 خواندیم یعنی(classها وfieldها و encapsulationها و abstract ها وinheritance ها و polymorphism ها ) ابتدا مثالی که برای شما با جز ییات کامل می زنم را در زبان کاتلین پیاده سازی کنید سپس خروجی تان را با خروجی من یعنی همان شکل مربوط به کنسول Intelij Idea مقایسه کنید و در صورت داشتن ایراد به سایر شکل ها توجه کنید.

کارخانه تولید ماشین مادر بسازید به طوریکه این کارخانه قادر است سه مدل ماشین Volvo و Benz و BMW را تولید کند .

این کارخانه از اجزای کوچگ تری ساخته شده است که به طور ناچار بایستی از آن ها ارث بری کند :(کارخانه فرزند قسمت های زیر هست )

1_ قسمت گیر بکس ساز که دو نوع گیر بکس اتو ماتیک و گیربکس دستی از ان ارث می برند .

2 _ قسمت ساخت تایر که دو نوع تایر اسپرت (پهن)و تایر معمولی از ان ارث می برند .

3_ قسمت ساخت شیشه ماشین که سه نوع شیشه ضد گلوله و شیشه دودی و شیشه معمولی از ان ارث می برند .

4_ قسمت ساخت موتور که دو نوع 6 سیلندر و 4 سیلندر از ان ارث می برند

5_قسمت ساخت ترمز که دو نوع ترمز معمولی و ترمز abs از ان ارث می برد

برای استفاده از کانستراکتور که در نکته 1 آمده بایستی زیر مجموعه های ساخت هر قسمت را به صورت کانستراکتوری طبقه بندی کنید .

یا برخی را کانستراکتوری کنید و برخی را به صورت overload بنویسید .

سپس هرکدام از محصولات ارث بری کنند از کارخانه مادر .

و در انتها با شماره مدل object هایی از ماشین های Volvo و Benz و BMW بسازید در فایل main.kt و رفتار ها و فیلد ها را صدا بزنید .

نکته1 : با استفاده از ارث بری انتخابی از هرکدام از زیر مجموعه های کارخانه مادر یا با استفاده از کانستراکتور ها ویژگی خاص هر ماشین را شبیه سازی کنید .

نکته2:برای نوشتن فیلد ها و فانکشن های مربوط به هر قسمت مثل ساخت شیشه دودی از دانش قبلی خود بیشتر استفاده کنید .

تذکر:مدلی که در زیر نوشته شده تقریبا با توضیحات بالا تطابق دارد.

به 8 شکل زیر با دقت توجه کنید:

>
شکل1:Intrface.kt

>
شکل2:Intrface.kt

>
شکل3:Intrface.kt

>
شکل4:Intrface.kt

>
شکل5:Intrface.kt

>
شکل6 قسمت1:class.kt

>
شکل6 قسمت2:class.kt

>
شکل7:file.kt

>
شکل8: کنسول Intelij Idea

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''