Animal
ки ҳайвонотро ифода мекунад, гирем ва дар он як усул voice
- " овоз " эҷод кунем:
public class Animal {
public void voice() {
System.out.println("Voice!");
}
}
Гарчанде ки мо нав ба навиштани барнома шурӯъ кардаем, шумо эҳтимолан мушкилоти эҳтимолиро дида метавонед: дар ҷаҳон ҳайвонҳо зиёданд ва онҳо ҳама ба таври гуногун «гуфтаанд»: гурбаҳо мияав мекунанд, мурғобҳо чирк мекунанд, морҳо ҳирс мекунанд. Ҳадафи мо оддӣ аст: аз эҷоди як қатор усулҳои овоздиҳӣ худдорӣ намоед. Ба ҷои он ки усулҳои voiceCat()
мияавидан, voiceSnake()
ҳирс кардан ва ғайраро эҷод кунем, мо мехоҳем, ки voice()
ҳангоми даъват кардани ин усул мор ҳирси занад, гурба мияв кунад ва саг аккос кунад. Мо метавонем ба осонӣ ба ин бо истифода аз механизми барҳамдиҳии усули (Override дар Java) ноил шавем . Википедиа тавзеҳи зерини истилоҳи "барқароркунӣ"-ро медиҳад: Усули бартарӣ додан дар барномасозии ба an object нигаронидашуда яке аз хусусиятҳои забони барномасозӣ мебошад, ки ба зерсинф ё синфи кӯдак имкон медиҳад татбиқи мушаххаси методе, ки аллакай дар яке аз суперсинфҳо амалӣ карда шудааст, таъмин намояд. ё синфҳои волидайн. Умуман, ин дуруст аст. Барқароркунӣ ба шумо имкон медиҳад, ки усули синфи волидайнро гиред ва татбиқи ин усулро дар ҳар як синфи насл нависед. Татбиқи нав волидайнро дар синфи кӯдак "иваз мекунад". Биёед бубинем, ки ин бо мисол чӣ гуна аст. Биёед барои синфи худ 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("Ш-ш-ш!");
}
}
Хакери хурд барои оянда: барои бекор кардани усулҳои синфи волидайн, ба рамзи синфи насл дар Intellij IDE a гузаред, Ctrl+O -ро пахш кунед ва аз меню " Усулҳои бекор кардани... " -ро интихоб кунед. Аз аввал ба истифодаи тугмаҳои гарм одат кунед, ин навиштани барномаҳоро суръат мебахшад! Барои муқаррар кардани рафторе, ки мо мехостем, мо якчанд корҳоро анҷом додем:
- Мо дар ҳар як синфи насл методеро бо ҳамон ном бо усули синфи волидайн эҷод кардем.
-
Мо ба компилятор гуфтем, ки мо методро бо як сабабе, ки дар синфи волидайн номида будем, номбар кардем: мо мехостем рафтори онро бекор кунем. Барои ин "паём" ба компилятор, мо дар метод шарҳи @Override гузоштаем .
Шарҳи @Override, ки дар болои усул ҷойгир шудааст, ба компилятор (ва барномасозоне, ки codeи шуморо мехонанд) мегӯяд: "Ҳама чиз хуб аст, ин хато ё фаромӯшии ман нест. Дар хотир дорам, ки чунин усул аллакай вуҷуд дорад ва ман мехоҳам онро бекор кунам." - Мо татбиқеро, ки барои ҳар як синфи насл лозим буд, навишт. Вақте ки занг занад, мор
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();
}
}
Натиҷаи консол: Вой! Мияв! Рррр! шшш! Аҷоиб, ҳама чиз тавре ки лозим аст, кор мекунад! Мо 4 тағирёбандаҳои истинодкунандаи синфи волидайнро эҷод кардем Animal
ва онҳоро ба 4 an objectи гуногуни синфҳои наслӣ таъин кардем. Дар натиҷа, ҳар як an object ба таври гуногун рафтор мекунад. Барои ҳар як синфҳои наслӣ, усули бекоршуда voice()
усули "модарӣ" -ро voice()
аз синф иваз кард Animal
(ки танҳо "Овоз!"-ро ба консол мебарорад). Барқароркунӣ як қатор маҳдудиятҳо дорад:
-
Усули бекоршуда бояд ҳамон аргументҳои усули волидайн дошта бошад.
Агар метод
voice
дар синфи волидайн ҳамчун вуруд қабул карда шавадString
, усули бекоршуда дар синфи кӯдак низ бояд ҳамчун input қабул карда шавад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