JavaRush /وبلاگ جاوا /Random-FA /Method Overriding Method یا Override در جاوا

Method Overriding Method یا Override در جاوا

در گروه منتشر شد
سلام! شما قبلاً از متدهایی در جاوا استفاده می کنید و چیزهای زیادی در مورد آنها می دانید. احتمالاً با موقعیتی مواجه شده اید که در یک کلاس متدهای زیادی با همان نام اما آرگومان های متفاوت وجود دارد. اگر به خاطر داشته باشید، در آن موارد از مکانیسم روش اضافه بار استفاده کردیم. امروز بیایید به وضعیت متفاوتی نگاه کنیم. تصور کنید که ما یک متد مشترک داریم، اما بسته به کلاسی که فراخوانی شده است، باید کارهای متفاوتی انجام دهد. چگونه این رفتار را اجرا کنیم؟ برای فهمیدن آن، بیایید یک کلاس والد را انتخاب کنیم Animalکه حیوانات را نشان می دهد و یک روش در آن ایجاد کنیم voice- " voice ":
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
اگرچه ما به تازگی نوشتن برنامه را شروع کرده‌ایم، به احتمال زیاد می‌توانید مشکل بالقوه را ببینید: حیوانات زیادی در جهان وجود دارند و همه آنها متفاوت «صحبت می‌کنند»: گربه‌ها میو می‌کنند، اردک‌ها می‌گویند، مارها هیس می‌کنند. نحوه عملکرد مکانیسم غلبه بر روش - 2 هدف ما ساده است: از ایجاد مجموعه ای از روش ها برای رای دادن خودداری کنید. به جای ایجاد روش هایی voiceCat()برای میو کردن، voiceSnake()برای خش خش کردن و غیره، می خواهیم voice()مار خش خش کند، گربه میو کند، و سگ پارس کند. ما به راحتی می توانیم با استفاده از مکانیسم overriding متد (Override در جاوا) به این امر دست یابیم . ویکی‌پدیا توضیح زیر را در مورد اصطلاح «اغلب دادن» ارائه می‌دهد: روش نادیده گرفتن روش در برنامه‌نویسی شی‌گرا یکی از ویژگی‌های یک زبان برنامه‌نویسی است که به یک کلاس فرعی یا کلاس فرزند اجازه می‌دهد تا پیاده‌سازی خاصی از روشی را که قبلاً در یکی از سوپرکلاس‌ها پیاده‌سازی شده است، ارائه دهد. یا کلاس های والدین در کل درست است. Overriding به شما این امکان را می دهد که متدی از یک کلاس والد را بگیرید و پیاده سازی خود را از این متد در هر کلاس نزول بنویسید. اجرای جدید "جایگزین" والدین در کلاس کودک خواهد شد. بیایید با یک مثال ببینیم این چگونه به نظر می رسد. بیایید 4 کلاس جانشین برای کلاس خود ایجاد کنیم Animal:
public class Bear extends Animal {
   @Override
   public void voice() {
       System.out.println("Р-р-р!");
   }
}
public class Cat extends Animal {

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

public class Dog extends Animal {

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


public class Snake extends Animal {

   @Override
   public void voice() {
       System.out.println("Ш-ш-ш!");
   }
}
یک هک زندگی کوچک برای آینده: برای نادیده گرفتن متدهای کلاس والد، به کد کلاس descendant در Intellij IDE a بروید، Ctrl+O را فشار دهید و “ Override methods... ” را از منو انتخاب کنید. از همان ابتدا به استفاده از کلیدهای میانبر عادت کنید، سرعت نوشتن برنامه ها را افزایش می دهد! برای تنظیم رفتاری که می‌خواستیم، چند کار انجام دادیم:
  1. ما یک متد در هر کلاس نزول با همان نام متد در کلاس والد ایجاد کردیم.
  2. ما به کامپایلر گفتیم که به دلیلی متد را مانند کلاس والد نامگذاری کردیم: می‌خواهیم رفتار آن را لغو کنیم. برای این "پیام" به کامپایلر، یک حاشیه نویسی @Override روی متد قرار می دهیم .
    حاشیه نویسی @Override که در بالای یک روش قرار داده شده است به کامپایلر (و برنامه نویسانی که کد شما را نیز می خوانند) می گوید: «همه چیز خوب است، این یک اشتباه یا فراموشی من نیست. من به یاد دارم که چنین روشی از قبل وجود دارد و من می خواهم آن را نادیده بگیرم."

  3. ما پیاده سازی مورد نیاز خود را برای هر کلاس نوادگان نوشتیم. هنگام صدا زدن، یک مار voice()باید هیس کند، یک خرس باید غرغر کند و غیره.
بیایید ببینیم که چگونه در برنامه کار می کند:
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.voice();
       animal2.voice();
       animal3.voice();
       animal4.voice();
   }
}
خروجی کنسول: Woof! میو! ررر! خسس! عالی، همه چیز همانطور که باید کار می کند! ما 4 متغیر مرجع از کلاس والد ایجاد کردیم Animalو آنها را به 4 شی مختلف از کلاس‌های فرعی نسبت دادیم. در نتیجه هر شیء رفتار متفاوتی دارد. برای هر یک از کلاس‌های فرعی، متد overridden voice()جایگزین متد «native» voice()از کلاس شد Animal(که به سادگی «Voice!» را به کنسول خروجی می‌دهد). نحوه عملکرد مکانیسم غلبه بر روش - 3 نادیده گرفتن تعدادی محدودیت دارد:
  1. متد لغو شده باید همان آرگومان های متد والد را داشته باشد.

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

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

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

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

    public class Animal {
    
       public void voice() {
    
           System.out.println("Voice!");
       }
    }
    
    
    public class Cat extends Animal {
    
       @Override
       public String voice() {         //error!
           System.out.println("Meow!");
           return "Meow!";
       }
    }

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

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