Overriding در جاوا

ناصر نادری | 1393/12/04


بنام خدا . در این مقاله در مورد  overriding مطالبی رو خدمت دوستان ارائه خواهیم داد .

overriding یعنی پیاده سازی مجدد یک متد ارث برده شده با همون نام و نوع بازگشتی ولی با بدنه متفاوت با توجه به نیاز کلاس فرزند . یعنی ما میتونیم  متدی  رو که از  کلاس والد به ارث بردیم با یک بدنه متفاوت پیاده سازی کنیم .

در شی گرایی overriding یعنی  از بین بردن عملکرد متد کلاس والد و پیاده کردن عملکرد کلاس فرزند در همان متد.

مثال زیر رو کمی موشکافانه نگاه کنید :

 class Phone{

    public void ring(){
        System.out.println("Phone Is Ringing");
    }
}

class Nokia extends Phone{

    public void ring(){
        System.out.println("Nokia Is Ringing");
    }
}

public class TestIt{

    public static void main(String args[]){
        Phone a = new Phone(); //تعریف یک آبجکت از نوع Phone 
        Phone b = new Nokia(); // تعریف یک آبجکت Nokia از نوع Phone

        a.ring();// متد کلاس والد اجرا خواهد شد

        b.ring();//متد کلاس فرزند اجرا خواهد شد
    }
} 

نتیجه  اجرای کد بالا :

 Phone Is Ringing
Nokia Is Ringing 

در مثال بالا آبجکت اول از نوع Phone و اشاره گر  Phone هست و آبجکت دوم از نوع Nokia و اشاره گر Phone هست . آبجکت a که مشخصا متد کلاس Phone رو اجرا میکنه ولی آبجکت b درسته که  یک نوع تعریف شده از کلاس Phone هست ولی  چون  بعد از new نام کلاس Nokia اومده پس اشاره اصلی این آبجکت به کلاس Nokia خواهد بود و متدهای override شده این کلاس رو  اجرا خواهد کرد. 

نکته : این نوع تعریف فقط وقتی معتبر هست که روی کلاسهای والد و فرزند اعمال بشه .

اما اگر کلاس Nokia متد دیگه ای داشت که مستقلا مال خودش بود و override شده  متد کلاس والد نبود در این صورت با آبجکت b نمیشد به اون دسترسی داشت .

مثال :

 class Phone{

    public void ring(){
        System.out.println("Phone Is Ringing");
    }
}

class Nokia extends Phone{

    public void ring(){
        System.out.println("Nokia Is Ringing");
    }
    public void getModel(){
        System.out.println("It Is Your Nokia Model");
    }
}

public class TestIt{

    public static void main(String args[]){
        Phone a = new Phone(); 
        Phone b = new Nokia(); 

        a.ring();// اجرای متد کلاس والد        
        b.ring();//اجرای متد کلاس فرزند
        b.getModel();
    }
} 

نتیجه اجرای کد بالا :

 TestIt.java:30: cannot find symbol
symbol : method getModel()
location: class Phone
b.getModel();

همونطور که میبینید یک خطای زمان کامپایل رو نشون میده . یعنی توسط b نمیتونیم  به  متدی از کلاس Nokia که در کلاس Phone وجو نداره دسترسی داشته باشیم و برای دسترسی به  این متد باید تعریف زیر رو داشته باشیم :

 Nokia n=new Nokia(); 

قوانینی که در overriding باید مد نظر قرار بدیم :

1-  آرگومانها و نوع برگشتی  متد override شده باید با آرگومانهای همون متد توی کلاس والد یکی باشن.

2-  نوع دسترسی  به متد در کلاس فرزند نباید محدودتر از کلاس والد باشه . بطور مثال اگه متد کلاس والد public باشه نباید متد کلاس فرزند private یا protected باشه .

3-  overriding فقط زمانی امکان پذیر هست که  کلاسی از کلاس دیگر ارث بری داشته باشه.

4- متدهایی که با کلمه کلیدی final تعریف شدن رو نمیتونیم override کنیم .

5-  اگر متدی از نوع static تعریف شده باشه نمیتونیم توکلاس فرزند اون رو override کنیم فقط میتونیم مجددا تعریف کنیم .

6- یک کلاس فرزند در پکیج واحد میتواند متد های  تمامی سوپر کلاس های موجو در همان پکیج  را که با final و private تعریف نشده باشن رو override کند .

7- اگر کلاس والد در یک پکیج دیگر باشد در این صورت تنها میتوان متدهایی از کلاس والد رو override کرد که final نباشن و حتما public یا protected باشن .

8- سازنده کلاس ها رو نمیشه override کرد .

میتونیم داخل متد override متد کلاس والد رو با کلمه کلیدی super فراخوانی کنیم .

 class Phone{

    public void ring(){
        System.out.println("Phone Is Ringing");
    }
}

class Nokia extends Phone{

    public void ring(){
        super.ring(); // فراخوانی متد کلاس والد
        System.out.println("Nokia Is Ringing");
    }
}

public class TestIt{

    public static void main(String args[]){

        Phone b = new Nokia(); // رفرنس کلاس والد به آبجکت کلاس فرزند
        b.ring(); //اجرای متد موجو در کلاس فرزند

    }
} 

نتیجه اجرای کد بالا :

 Phone Is Ringing
Nokia Is Ringing 

تا جلسه بعد در پناه حق...


فایلهای ضمیمه
توجه! هیچ فایل ضمیمه ای برای این مطلب یافت نشد

نظرات شما نظر جدید