Override

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

   1: package myfirstprogram;
   2: 
   3: class Parent   
   4: {
   5:     public void ShowMessage()                      
   6:     {                                              
   7:         System.out.println("Message from Parent.");
   8:     }                                              
   9: } 
  10:
  11: class Child extends Parent
  12: {
  13:     public void ShowMessage()                       
  14:     {                                              
  15:         System.out.println("Message from Child.");  
  16:     }                                              
  17: }  
  18: 
  19: public class MyFirstProgram 
  20: {
  21:     public static void main(String[] args) 
  22:     {
  23:         Parent myParent = new Parent();
  24:         Child myChild = new Child();
  25:                                                   
  26:         myParent.ShowMessage();                   
  27:         myChild.ShowMessage(); 
  28:     } 
  29: }
Message from Parent.
Message from Child.

همانطور که در کد بالا مشاهده می کنید دو کلاس یه نام Parent (خطوط 9-3) و Child (خطوط 17-11) تعریف کرده ایم. کلاس Child که از کلاس Parent ارث می برد شامل متدی است که متد ()ShowMessage از کلاس پایه را override یا به صورت دیگری پیاده سازی می کند. همانطور که مشاهده می کنید این دو متد دقیقا شبیه به هم هستند و تنها اختلاف آنها در پیامی است که نشان می دهند. برای Override کردن یک متد قواعدی وجود دارد که در زیر به آنها اشاره شده است :

  • تابع override شده یکی باشد.
  • نوع مقدار بازگشتی تابع باید همانند یا فرزندی از نوع مقدار بازگشتی تابع override شده کلاس پدر باشد.
  • سطح دسترسی تابع نمی تواند محدودتر از سطح دسترسی تابع override شده باشد. برای مثال: اگر تابع کلاس پدر به صورت public تعریف شده باشد، در این صورت تابع کلاس فرزند نمی تواند private یا protected باشد.
  • تنها توابعی از کلاس پدر که توسط کلاس فرزند ارث بری شده اند می توانند override شوند.
  • توابع static نمی توانند override شوند، ولی می توانند دوباره در کلاس فرزند تعریف شوند.
  • اگر تابعی نمی تواند ارث برده شود، همانطور هم نمی تواند override شود.
  • کلاس فرزند موجود در پکیج یکسان با کلاس پدر، می تواند تمامی توابعی از کلاس پدر را که به صورت private یا final تعریف نشده باشند را override کند.
  • کلاس فرزند در یک پکیج دیگر از کلاس پدر تنها می تواند توابع public یا protected کلاس پدر را که final نیستند را override کند.
  • سازنده ها نمی توانند override شوند.

با استفاده از کلمه کلیدی super (خط 15) می توانید متد کلاس پایه را در داخل متد override شده فراخوانی کنید:

   1: package myfirstprogram;
   2: 
   3: class Parent   
   4: {                                                 
   5:     public void ShowMessage()                
   6:     {                                                                          
   7:         System.out.println("Message from Parent.");
   8:     }                                                                  
   9: }                                                 
  10:                                                   
  11: class Child extends Parent                              
  12: {                                                 
  13:     public void ShowMessage()                  
  14:     {
  15:         super.ShowMessage();                                                        
  16:         System.out.println("Message from Child."); 
  17:     }                                                      
  18: }  
  19: 
  20: public class MyFirstProgram 
  21: {
  22:     public static void main(String[] args) 
  23:     {        
  24:         Parent myParent = new Parent();           
  25:         Child myChild = new Child();              
  26:                                                   
  27:         myParent.ShowMessage();                   
  28:         myChild.ShowMessage(); 
  29:     }    
  30: }
Message from Parent.
Message from Parent.
Message from Child.

می توان یک کلاس دیگر که از کلاس Child ارث بری می کند ایجاد کرده و دوباره متد ShowMessage() را override کرده و آنرا به صورت دیگر پیاده سازی کنیم. اگر بخواهید متدی را که ایجاد کرده اید به وسیله سایر کلاسها override نشود کافیست که از کلمه کلیدی final به صورت زیر استفاده کنید :

public final void ShowMessage()

حال اگر کلاس دیگری از کلاس Child ارث ببرد نمی تواند متد ShowMessage() را override کند.