Animal
که حیوانات را نشان می دهد و یک روش در آن ایجاد کنیم voice
- " voice ":
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
اگرچه ما به تازگی نوشتن برنامه را شروع کردهایم، به احتمال زیاد میتوانید مشکل بالقوه را ببینید: حیوانات زیادی در جهان وجود دارند و همه آنها متفاوت «صحبت میکنند»: گربهها میو میکنند، اردکها میگویند، مارها هیس میکنند. هدف ما ساده است: از ایجاد مجموعه ای از روش ها برای رای دادن خودداری کنید. به جای ایجاد روش هایی 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... ” را از منو انتخاب کنید. از همان ابتدا به استفاده از کلیدهای میانبر عادت کنید، سرعت نوشتن برنامه ها را افزایش می دهد! برای تنظیم رفتاری که میخواستیم، چند کار انجام دادیم:
- ما یک متد در هر کلاس نزول با همان نام متد در کلاس والد ایجاد کردیم.
-
ما به کامپایلر گفتیم که به دلیلی متد را مانند کلاس والد نامگذاری کردیم: میخواهیم رفتار آن را لغو کنیم. برای این "پیام" به کامپایلر، یک حاشیه نویسی @Override روی متد قرار می دهیم .
حاشیه نویسی @Override که در بالای یک روش قرار داده شده است به کامپایلر (و برنامه نویسانی که کد شما را نیز می خوانند) می گوید: «همه چیز خوب است، این یک اشتباه یا فراموشی من نیست. من به یاد دارم که چنین روشی از قبل وجود دارد و من می خواهم آن را نادیده بگیرم." - ما پیاده سازی مورد نیاز خود را برای هر کلاس نوادگان نوشتیم. هنگام صدا زدن، یک مار
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!» را به کنسول خروجی میدهد). نادیده گرفتن تعدادی محدودیت دارد:
-
متد لغو شده باید همان آرگومان های متد والد را داشته باشد.
اگر متدی
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!"); } }
-
روش نادیده گرفته شده باید همان نوع بازگشتی را داشته باشد که روش والد است.
در غیر این صورت، یک خطای کامپایل دریافت خواهیم کرد:
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!"; } }
-
اصلاح کننده دسترسی یک روش لغو شده نیز نمی تواند با روش "اصلی" متفاوت باشد:
public class Animal { public void voice() { System.out.println("Voice!"); } } public class Cat extends Animal { @Override private void voice() { //error! System.out.println("Meow!"); } }
voice()
برای همه بهجای دستهای از روشها voiceDog()
و voiceCat()
غیره .
GO TO FULL VERSION