Override
فرض کنید شما تابع A را در کلاس A دارید و کلاس B از کلاس A ارث بری میکند، در این صورت تابع A در کلاس B در دسترس خواهد بود. اما تابع A دقیق همان تابعی است که از کلاس A به ارث برده شده است. حال اگر بخواهید که این تابع رفتار متفاوتی از خود نشان دهد چکار میکنید؟ برای حل این مشکل باید تابع کلاس پایه را Override کنید. به تکه کد زیر توجه کنید:
1: open class Parent 2: { 3: open fun ShowMessage() 4: { 5: println("Message from Parent.") 6: } 7: } 8: 9: open class Child : Parent() 10: { 11: override fun ShowMessage() 12: { 13: println("Message from Child.") 14: } 15: } 16: 17: fun main(args: Array<String>) 18: { 19: val myParent = Parent() 20: val myChild = Child() 21: 22: myParent.ShowMessage() 23: myChild.ShowMessage() 24: }
Message from Parent. Message from Child.
همانطور که در کد بالا مشاهده میکنید دو کلاس به نام Parent (خطوط 7-1) و Child (خطوط 15-9) تعریف کردهایم. کلاس Child که از کلاس Parent ارث میبرد شامل تابعی است که تابع ()ShowMessage از کلاس پایه را override یا به صورت دیگری پیاده سازی میکند. همانطور که مشاهده میکنید این دو تابع دقیقاً شبیه به هم هستند و تنها اختلاف آنها در پیامی است که نشان میدهند. با استفاده از کلمه کلیدی super (خط 13 کد زیر) میتوانید تابع کلاس پایه را در داخل تابع override شده فراخوانی کنید:
1: open class Parent 2: { 3: open fun ShowMessage() 4: { 5: println("Message from Parent.") 6: } 7: } 8: 9: class Child : Parent() 10: { 11: override fun ShowMessage() 12: { 13: super.ShowMessage() 14: println("Message from Child.") 15: } 16: } 17: 18: fun main(args: Array<String>) 19: { 20: val myParent = Parent() 21: val myChild = Child() 22: 23: myParent.ShowMessage() 24: myChild.ShowMessage() 25: }
Message from Parent. Message from Parent. Message from Child.
میتوان یک کلاس دیگر که از کلاس Child ارث بری میکند ایجاد کرده و دوباره تابع ShowMessage() را override کرده و آنرا به صورت دیگر پیاده سازی کنیم. اگر بخواهید تابعی را که ایجاد کردهاید به وسیله سایر کلاسها override نشود کافیست که از کلمه کلیدی final به صورت زیر استفاده کنید:
final fun ShowMessage()
حال اگر کلاس دیگری از کلاس Child ارث ببرد نمیتواند تابع ShowMessage() را override کند.