اگه با اندروید و جاوا کار کرده باشید ، صد در صد با ارث بری و مشتق شدن آشنا هستید . نمونه خیلی بارز و شناخته شدش ، توی تعریف کلاس ها توی اندروید هست که مثلا میگیم کلاس MainActivity extends Fragment . ما اینجا دو تا کلاس داریم . و حتما میدونید که اینجوری خونده میشه : کلاس MainActivity مشتق بشه از کلاس Fragment . این یعنی ارث بری . یعنی ویژگی هایی که توی یه کلاس هست رو بتونیم به ارث ببریم . در اصطلاح ، به MainActivity میگیم Sub class . یعنی کلاسی که زیر کلاس اصلی قرار میگیره ( کلاس کوچیکتر ) و به Fragment میگیم Super class ( که این سوپر با اون سوپر تفاوت فاحشی داره ! البته منظورم سوپر مارکت بود ! لعنت به هر چی ذهن منحرفه !! ) . 

حالا میخوایم با ارث بری یا همون Inheritance توی کاتلین آشنا بشیم . توی این مثال نمیام دو تا کلاس جداگانه تعریف کنم که بگم این از اون مشتق بشه . همه کدها رو توی کلاس Main.kt می نویسم که جمع و جور باشه . فرض کنیم یه کلاس داریم به اسم Person یا همون شخص که دو تا ورودی میگیره ( که توی این مثال نام و سن شخص هست ) و اونو چاپ میکنه . این کلاس Person رو به عنوان کلاس اصلی انتخاب میکنم و میخوام بعدا کلاسی تعریف کنم که از Person مشتق بشه و مقادیرم رو براش بفرستم . ( یه نکته ای رو بگم ، واسه ارث بری باید با یه چیزی به نام تابع سازنده یا همون Constructor آشنا باشید که من آموزش بعدیم مربوط به همین تابع سازنده توی کاتلین هست . فعلا نمیخواد ذهنتون رو درگیر تابع سازنده کنید ، فقط یه سیخ کوچولو بهش میزنیم و رد میشیم !! ) . پس من میام کلاس Person رو تعریف میکنم . اینجوری : 

توی کدبالا و خط سوم ، قبل از class از یه کلمه کلیدی استفاده کردیم به اسم open . ( این open هم با اون open فرق میکنه ! البته منظورم اوپن آشپزخونه بود که بازم لعنت به افکار منحرف !! ) . ولی این کلمه کلیدی open چی هست ؟ توی کاتلین ، مثه جاوا ، ما هر کلاسی که تعریف کنیم به صورت پیشفرض final هست . یعنی نمیتونیم مقادیرش رو از یه کلاس دیگه تغییر بدیم . پس میایم با نوشتن open این خاصیت کلاس رو غیرفعال میکنیم . چون ما میخوایم از این کلاس Person بعدا استفاده کنیم و هی مقادیر بهش بفرستیم . ( ممکنه بخوایم ۱۰۰ جا این کلاس Person رو استفاده کنیم . پس عقل حکم میکنه که اونو از حالت final خارج کنیم . ) . این کلاس Person اسم و سن رو به عنوان ورودی میگیره و چاپ میکنه . ولی init چی میگه این وسط ؟؟! اینجاست که با مفهوم تابع سازنده برخورد میکنیم . این کلاس Person یه تابع سازنده هست . تابع سازنده ، تابعی هست که یه چیزی رو براش ارسال میکنیم و با فراخوانیش ، خودش اتوماتیک واسمون یه کاری رو انجام میده . توی کاتلین ما اگه بخوایم تابع سازنده داشته باشیم و بهش میگم یه عملیاتی رو واسمون انجام بده ، باید اون کدها رو داخل init بنویسیم ( همونجور که گفتم بعدا یه آموزش میذارم در مورد تابع سازنده توی کاتلین ) . خوب . پس ما کلاس اصلیمون رو که میخوایم ازش استفاده کنیم تعریف کردیم . حالا ما میام یه کلاس تعریف میکنیم که از کلاس Person مشتق بشه . کلاسی با نام زیبای Negar و این کدها : 

به خط سوم خوب دقت کنید . ما میخوایم کلاس Negar از کلاس Person مشتق بشه . پس باید دقیقا همون دو تا ورودی رو بگیره که کلاس Person داره . یعنی age , name . ولی چه جوری بگیم کلاس Negar مشتق بشه از کلاس Person ؟ خیلی ساده و با استفاده از علامت : که بهش میگن دو نقطه ! پس خیلی ساده تر ، معادل MainActivity extends Fragment توی کاتلین میشه این 

MainActivity : Fragment

ما توی کلاس Negar با استفاده از fun یه تابع هم تعریف کردیم به اسم NegarSay که میاد یه جمله ای رو واسمون چاپ میکنه . خـــــــوب ، ما کلاس اصلیمون رو تعریف کردیم ، کلاس نگار رو هم که از کلاس اصلی مشتق شده تعریف کردیم و حالا میام توی تابع اصلی کلاسمون ، یعنی main اجراش میکنیم . اینجوری : 

ما توی خط چهارم یه مقدار تعریف کردیم به اسم n1 و گفتیم از نوع کلاس Negar باشه و یه عدد ۲۵ و یه اسم ( که از نوع String هست ) با مقدار negar هم فرستادیم . این دو تا مقدار فرستاده میشن واسه کلاس Negar و چون کلاس نگار از کلاس Person مشتق شده ، فرستاده میشن به کلاس Person و کلاس Person دو تا ورودی میگرفت و چاپشون میکرد . پس اول کلاس Person کار خودش رو میکنه و بعد با استفاده از خط پنجم میگیم که تابع NegarSay هم اجرا بشه . پس کل کدهامون اینه : 

که خروجیش میشه :

My name is negar
My age is 25
I love Mojtaba so much

حالا بیاید فرض کنیم که ما توی کلاس اصلی خودمون یه تابع داریم و میخوایم کلاسی که توش هستیم رو مشتق کنیم از کلاس اصلیمون ، ولی نمیخوایم تابعی که توی کلاس اصلیمون هست ، توی کلاسی که هستیم هم اجرا بشه . میایم و با استفاده از override اون تابع رو جوری بازنویسی میکنیم که خودمون دوس داریم . به این کدها نگاه کنید تا متوجه بشید : 

که اگه کدهای بالارو اجرا کنیم ، خروجیش میشه : 

My favorite age is 31

ما کلاس Person و تابع showAge رو ، هر دوتاشو open تعریف کردیم تا بعدا دستمون باز باشه واسه استفاده کردن ازشون . توی کلاس نگار با استفاده از override تابع showAge رو که مال کلاس اصلی هست رو واسه خودمون یه جور دیگه تعریف کردیم و پیغام مورد نظر خودمون رو گفتیم چاپ کن . 

خــــــــــــــــــــــــــــــــــــوب ، اینم از اشاره ای کوتاه به ارث بری در کاتلین ( کی فکرشو میکرد جناب تخم مرغ ، جرقه یه جنگ بزرگ رو بزنه ؟؟؟!!! ) 

آموزش ارث بری در کاتلین

مجتبی صابری


همه عشقم برنامه نویسی هست | t.me/kotlin9


پیمایش نوشته


پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *