CodeGym /وبلاگ جاوا /Random-FA /Overriding متد در جاوا
John Squirrels
مرحله
San Francisco

Overriding متد در جاوا

در گروه منتشر شد
سلام! شما در حال حاضر از روش های جاوا استفاده می کنید و چیزهای زیادی در مورد آنها می دانید. احتمالاً با این وضعیت روبرو شده اید که یک کلاس متدهای زیادی با نام یکسان اما پارامترهای متفاوت دارد. به یاد دارید که در آن موارد ما از روش اضافه بار استفاده کردیم. امروز در حال بررسی وضعیت دیگری هستیم. تصور کنید که ما یک متد مشترک داریم، اما باید کارهای مختلفی را در کلاس‌های مختلف انجام دهد. چگونه این رفتار را اجرا کنیم؟ برای درک، بیایید یک کلاس والد Animal را در نظر بگیریم که نشان دهنده حیوانات است و یک متد speak در آن ایجاد می کنیم:
public class Animal {

   public void speak() {

       System.out.println("Hello!");
   }
}
اگرچه ما تازه نوشتن برنامه را شروع کرده‌ایم، احتمالاً شما یک مشکل بالقوه می‌بینید: حیوانات زیادی در دنیا وجود دارند و همه آنها متفاوت «صحبت می‌کنند»: گربه‌ها میو می‌کنند، اردک‌ها می‌گویند، و مارها هیس می‌کنند. نحوه کار بر روی روش - 2هدف ما ساده است: اجتناب از ایجاد بارهای روش صحبت کردن. به جای ایجاد یک متد catSpeak() برای میو کردن، یک متد snakeSpeak() برای هیس زدن و غیره، می خواهیم متد speak() را فراخوانی کنیم و snake hiss، cat meow و پارس سگ را داشته باشیم. ما به راحتی می توانیم با استفاده از روش overriding به این امر برسیم. ویکی‌پدیا توضیح زیر را در مورد اصطلاح «اغلب» ارائه می‌دهد: «فرار روش»، در برنامه‌نویسی شی گرا، یک ویژگی زبانی است که به یک کلاس فرعی یا کلاس فرزند اجازه می‌دهد تا پیاده‌سازی خاصی از یک متد را ارائه دهد که قبلاً توسط یکی از سوپرکلاس‌ها یا کلاس‌های آن ارائه شده است. کلاس های والد که اساساً درست است. نادیده گرفتن روش به شما این امکان را می دهد که روشی از کلاس والد را انتخاب کنید و پیاده سازی خود را در هر کلاس فرزند بنویسید. اجرای جدید جایگزین اجرای والدین در کلاس کودک می شود. بیایید ببینیم که چگونه این در یک مثال به نظر می رسد. 4 کلاس ایجاد کنید که کلاس Animal ما را به ارث می برند :
public class Bear extends Animal {
   @Override
   public void speak() {
       System.out.println("Growl!");
   }
}
public class Cat extends Animal {

   @Override
   public void speak() {
       System.out.println("Meow!");
   }
}

public class Dog extends Animal {

   @Override
   public void speak() {
       System.out.println("Woof!");
   }
}


public class Snake extends Animal {

   @Override
   public void speak() {
       System.out.println("Hiss!");
   }
}
"در اینجا یک لایف هک کوچک برای آینده وجود دارد: برای نادیده گرفتن متدهای کلاس والد، به کد کلاس فرزند در IntelliJ IDE بروید، Ctrl+O را کلیک کنید و "Override method..." را در منو انتخاب کنید. به استفاده از کلیدهای داغ عادت کنید. از همان ابتدا - به شما کمک می کند تا برنامه ها را سریعتر بنویسید! برای مشخص کردن رفتاری که نیاز داریم، چند کار انجام دادیم:
  1. در هر کلاس فرزند، متدی با همان نام متد کلاس والد ایجاد کردیم.

  2. ما به کامپایلر گفتیم که نامگذاری متد مانند کلاس والد اتفاقی نبوده است: می‌خواهیم رفتار آن را لغو کنیم. برای برقراری ارتباط با کامپایلر، حاشیه نویسی @Override را بالای روش قرار می دهیم.
    وقتی بالای یک روش قرار می‌گیرد، حاشیه‌نویسی Override @ به کامپایلر (و همچنین برنامه‌نویسانی که کد شما را می‌خوانند) اطلاع می‌دهد: «همه چیز درست است. این یک اشتباه نیست من فراموشکار نیستم من می دانم که چنین روشی از قبل وجود دارد و می خواهم آن را لغو کنم.

  3. ما پیاده سازی مورد نیاز خود را برای هر کلاس کودک نوشتیم. هنگامی که متد speak() فراخوانی می شود، یک مار باید هیس کند، یک خرس باید غرغر کند و غیره.
بیایید ببینیم که چگونه این در یک برنامه کار می کند:
public class Main {

   public static void main(String[] args) {

       Animal animal1 = new Dog();
       Animal animal2 = new Cat();
       Animal animal3 = new Bear();
       Animal animal4 = new Snake();

       animal1.speak();
       animal2.speak();
       animal3.speak();
       animal4.speak();
   }
}
خروجی کنسول:
Woof!
Meow!
Growl!
Hiss!
عالی! همه چیز همان طور که باید کار می کند! ما 4 متغیر مرجع ایجاد کردیم که اشیاء کلاس والد Animal را ذخیره می‌کنند و نمونه‌هایی از 4 کلاس فرزند مختلف را به آنها اختصاص دادیم. در نتیجه، هر شیء رفتار خاص خود را نشان می دهد. برای هر کلاس فرزند، متد speak() overrid شده جایگزین متد "native" speak() در کلاس Animal شد (که به سادگی "Hello!" را نشان می دهد). نحوه کار بر روی روش - 3نادیده گرفتن چندین محدودیت دارد:
  1. متد نادیده گرفته شده باید همان پارامترهای متد والد را داشته باشد.

    اگر متد speak کلاس والد دارای پارامتر String باشد ، متد overrid شده در کلاس فرزند نیز باید پارامتر String داشته باشد . در غیر این صورت، کامپایلر یک خطا ایجاد می کند:

    public class Animal {
    
       public void speak(String s) {
    
           System.out.println("Hello! " + s);
       }
    }
    
    public class Cat extends Animal {
    
       @Override // Error!
       public void speak() {
           System.out.println("Meow!");
       }
    }

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

    در غیر این صورت، یک خطای کامپایلر دریافت خواهیم کرد:

    public class Animal {
    
       public void speak() {
    
           System.out.println("Hello!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String speak() {         // Error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

  3. اصلاح کننده دسترسی در روش لغو نیز باید مانند روش اصلی باشد:

    public class Animal {
    
          public void speak() {
    
                System.out.println("Hello!");
          }
    }
    
    public class Cat extends Animal {
    
           @Override
           private void speak() {      // Error!
               System.out.println("Meow!");
           }
    }
جایگزینی متد در جاوا یکی از راه‌های پیاده‌سازی چندشکلی است (اصل OOP که در درس گذشته توضیح دادیم). این بدان معنی است که مزیت اصلی آن همان انعطاف پذیری است که قبلاً در مورد آن صحبت کردیم. ما می‌توانیم یک سیستم ساده و منطقی از کلاس‌ها بسازیم که هرکدام رفتار خاصی دارند (گوش سگ‌ها، میو گربه‌ها)، با یک رابط مشترک - یک متد speak() برای همه آنها به جای تعداد زیادی متد، به عنوان مثال dogSpeak() , speakCat () ، و غیره.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION