Override

override یا باز نویسی، یعنی اینکه ما کاری کنیم که متدهای کلاس پایه در داخل کلاس مشتق رفتار متفاوتی از خود نشان دهند. به عنوان مثال شما متد A را در کلاس A دارید و کلاس B از کلاس A ارث بری می‌کند، در این صورت متد A در کلاس B در دسترس خواهد بود. اما متد A دقیق همان متدی است که از کلاس A به ارث برده شده است. حال اگر بخواهید که این متد رفتار متفاوتی از خود نشان دهد چکار می‌کنید؟ Overriding یا بازنویسی این مشکل را برطرف می‌کند. به تکه کد زیر توجه کنید :

 1: class Parent
 2:   def showMessage
 3:     puts "Message from Parent."
 4:   end
 5: end
 6: 
 7: class Child < Parent
 8:   def showMessage
 9:     puts "Message from Child."
10:   end
11: end
12: 
13: myChild  = Child.new
14: myChild.showMessage
Message from Child.

همانطور که در کد بالا مشاهده می‌کنید، یک متد به نام ()ShowMessage (خطوط 4-2) در کلاس Person تعریف شده است که یک پیغام چاپ می‌کند. حال می‌خواهیم این متد در کلاس Child پیغام Message from Child را چاپ کند. برای این منظور کافیست که عینا نام متد موجود در کلاس Parent را در داخل کلاس Child نوشته کدهای خودتان را به بدنه آن اضافه کنید. حال فرض کنید که می خواهید این متد علاوه بر کدهایی خود، کدهایی دیگر را در داخل کلاس فرزند اجرا کند. برای این کار باید متد موجود در کلاس Parent را با استفاده از متد از پیش تعریف شده super فراخوانی کنید:

 1: class Parent
 2:   def showMessage
 3:     puts "Message from Parent."
 4:   end
 5: end
 6: 
 7: class Child < Parent
 8:   def showMessage
 9:     super
10:     puts "ShowMessage method was overrided!"
11:   end
12: end
13: 
14: myChild  = Child.new
15: myChild.showMessage
Message from Parent.
ShowMessage method was overrided !

در کد بالا ما می‌خواهیم این متد در کلاس Child علاوه بر این پیغام پیغام !ShowMessage method was overrided را نیز چاپ کند. برای این کار همانطور که مشاهده می‌کنید همین متد را در خطوط (11-8) و در داخل کلاس Child می‌نویسیم و سپس با استفاده از متد از پیش تعریف شده super در خط 9 به برنامه اعلام می‌کنیم که قصد استفاده از تمام کدهای بدنه همین متد در کلاس مادر را داریم بعلاوه اینکه در خط بعد از این دستور یعنی خط 10 کدهای اضافی را که قرار است این متد، در کلاس فرزند، یعنی Child داشته باشد، می‌نویسیم. شاید این کار برای متدی به این سادگی زیاد کارا نباشد، اما اگر متد کلاس مادر دارای کدهای زیادی در بدنه خود باشد و شما بخواهید کد دیگری در کلاس فرزند به آن اضافه کنید استفاده از این روش کدنویسی را بهینه و ساده‌تر می‌کند.