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

وراثت در کاتلین (Kotlin Inheritance) آموزش زبان برنامه نویسی کاتلین Kotlin

وراثت     

Kotlin Inheritance

مفهوم وراثت را در دنیایی که در آن دنیای واقعی میدانید. از نظر بیولوژیکی، نوع خون و رنگ چشم، محصول ژنهایی هستند که از والدین به ارث برده میشوند . بسیاری از رفتارهای شما نیز از والدینتان به ارث میرسد.

چرا ارث‌بری؟

فرض کنید داخل برنامه سه کاراکتر math teacher، footballer و businessman وجود دارد. از آنجایی که همه کاراکترها انسان هستند، همگی می‌توانند راه بروند و صحبت کنند. با این حال هر یک از آن‌ها مهارت‌های مخصوص خود را نیز دارا هستند. math teacher به خوبی ریاضی آموزش می‌دهد، footballer به صورت حرفه‌ای فوتبال بازی می‌کند و businessman می‌تواند تجارت کند.

همانطور که می‌بینید سه کلاس فوق دارای توابع مشترکی همچون ()walk هستند. این یعنی کد ()walk یا ()talk را باید سه بار (برای هر یک از کلاس‌ها) کپی پیست کنیم. اگر قرار باشد قابلیت جدیدی که بین سه کلاس مشترک است مثلا eat یا خوردن را اضافه کنید باز باید به همین صورت در هر سه کلاس این کار را تکرار کنید. کپی کردن کدها کاری مستعد خطاست و بدتر از آن کدهای تکراری، حجم برنامه را بیهوده افزایش داده و باعث شلوغ شدن منطق آن می‌شوند.

مفهوم ارث‌بری اینجا به دادمان می‌رسد. شما می‌توانید یک کلاس پایه تحت عنوان Person ایجاد کنید. سپس همه‌ی توابع مشترک سه کلاس را در همین کلاس تعریف کنید و سپس در کلاس‌های مشتق شده این توابع را به ارث ببرید. در چنین حالتی به راحتی می‌توانید کلاس جدیدی مثلاً Artist, Developer و … ایجاد کنید و ویژگی‌های مشترک را از کلاس Person به ارث ببرید. مزیت دیگر اث‌بری این است که تمامی تغییرات روی توابع مشترک در یک نقطه‌ی مرکزی یعنی کلاس پایه صورت می‌گیرد. تغییرات حاصل را تمامی کلاس‌های ارث‌برنده دریافت می‌کنند بدون اینکه لازم باشد کار اضافه‌ای انجام دهید.

ارث‌بری در کاتلین

خب اجازه دهید بحث‌های بالا را در قالب کد پیاده‌سازی کنیم:

اینجا Person یک کلاس پایه بوده و کلاس‌های MathTeacher, Footballer و Buisinessman کلاس‌های مشتق شده از Person هستند. به کلمۀ open قبل از کلاس پایه Person توجه کنید. مهم است.

در کاتلین به صورت پیش‌فرض کلاس‌ها در کاتلین final هستند. اگر با جاوا آشنا باشید می‌دانید که از کلاس‌های final نمی‌توان زیرکلاس ایجاد کرد. با استفاده از کلمه‌ی open، کامپایلر به شما اجازه می‌دهد تا از این کلاس برای ساخت زیرکلاس استفاده کنید با اصطلاحاً از آن ارث‌بری نمایید.

مثال:

خروجی:

اینجا دو کلاس MathTeacher و Footballer از کلاس Person مشتق شده‌اند. سازندۀ اولیۀ Person دو پراپرتی age و name را تعریف کرده است و یک initializer block هم دارد. این بلاک (و توابع عضوِ) کلاس پایۀ Person می‌تواند توسط کلاس‌های مشتق شده مورد استفاده قرار گیرد. کلاس‌های مشتق شده MathTeacher و Footballer توابع عضو مختص خود را نیز دارند: ()teachMaths و ()playFootball. این توابع تنها از داخل شی‌ای که تعریف شده‌اند قابل دسترسی هستند.

وقتی شی t1 از کلاس MathTeacher ساخته می‌شود:

پارامترهایش به سازندۀ اولیه پاس داده می‌شوند. در کاتلین، بلاک init زمانی فرخوانی می‌شود که آبجکت ما ساخته شده باشد. بنابراین MathTeacher از کلاس Person مشتق می‌شود و داخل کلاس پایه (Person) دنبال initializer Block می‌گردد، سپس اچرایش می‌کند. اگر MathTeacher این بلاک را داشت، کامپایلر آن را هم اجرا می‌کرد. سپس تابع ()teachMaths برای شی t1 فرخوانی می‌شود. این کار با دستور ()t1.teachMaths انجام گرفته است.

برنامه برای شی f1 از کلاس Footballer هم اینگونه رفتار می‌کند. بعد از ساخت این شی بلاک initializer کلاس پایه اجرا شده سپس متد ()playFootbal از کلاس Footballer با دستور ()f1.playFootball فرخوانی شده است.

نکات مهم ارث‌بری در زبان کاتلین

  • اگر کلاسی حاوی سازندۀ اولیه بود، کلاس پایه بایستی با پارامترهای سازندۀ اولیه مقداردهی شود. در برنامۀ بالا، هر دو کلاس مشتق شده دارای دو پارامتر age و name هستند و هر دوی این پارامترها با سازندۀ اولیۀ کلاس پایه مقدار دهی شده‌اند.

مثالی دیگر:

اینجا سازندۀ اولیۀ کلاس مشتق شده دارای ۳ پارامتر و کلاس پایه دارای دو پارامتر است. توجه کنید که هر دو پارامتر کلاس پایه مقداردهی اولیه شده‌‌اند.

  • وقتی هیچ سازندۀ اولیه‌ای وجود نداشته باشد، بایستی با کلمه‌ی super سازندۀ کلاس پایه فرخوانی شود یا این کار را به سازندۀ دیگری واگذار کند. برای مثال:

Override کردن توابع عضو و پراپرتی‌ها در کاتلین

اگر کلاس پایه و کلاس مشتق حاوی تابع عضو یا پراپرتی هم‌نامی باشند باید تابع عضو کلاس مشتق را با کلمه‌ی override کنید و با کلمه‌ی open تابعی که متعلق به کلاس پایه هست را نشانه‌گذاری کنید.

خروجی:

دستور (girl.displayAge(31 در اینجا متد ()displayAge از کلاس مشتق یعنی Girl را فراخونی می‌کند چون override شده است.

به همین صورت پراپرتی‌ها را هم می‌توان override کرد.

 

خروجی:

همانطور که می‌بینید از کلیدواژه‌های override و open برای پراپرتی age در کلاس مشتق و کلاس پایه استفاده کرده‌ایم.

فراخوانی اعضای کلاس پایه از داخل کلاس مشتق شده در کاتلین

برای فرخوانی توابع و پراپرتی‌هایِ کلاس پایه از داخل کلاس مشتق شده، کلیدواژۀ super را به کار می‌بریم. به این صورت:

خروجی:

Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance Kotlin Inheritance 

مطالب مرتبط