JavaRush /Блоги Java /Random-TG /Механизми бекоркунии метод ё Override дар Java

Механизми бекоркунии метод ё Override дар Java

Дар гурӯҳ нашр шудааст
Салом! Шумо аллакай дар Java усулҳоро истифода мебаред ва дар бораи онҳо бисёр чизро медонед. Эҳтимол шумо бо вазъияте дучор шудаед, ки дар як синф усулҳои зиёде бо ҳамон ном, вале далелҳои гуногун вуҷуд доштанд. Агар дар хотир доред, дар он мавридҳо мо механизми изофаборкуниро истифода мебурдем. Имрӯз биёед вазъияти дигарро дида бароем. Тасаввур кунед, ки мо як усули умумӣ дорем, аммо вобаста аз он, ки он ба кадом синф даъват шудааст, бояд корҳои гуногунро иҷро кунад. Ин рафторро чӣ гуна бояд амалӣ кард? Барои фаҳмидани он, биёед як синфи волидайнеро, Animalки ҳайвонотро ифода мекунад, гирем ва дар он як усул voice- " овоз " эҷод кунем:
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
Гарчанде ки мо нав ба навиштани барнома шурӯъ кардаем, шумо эҳтимолан мушкилоти эҳтимолиро дида метавонед: дар ҷаҳон ҳайвонҳо зиёданд ва онҳо ҳама ба таври гуногун «гуфтаанд»: гурбаҳо мияав мекунанд, мурғобҳо чирк мекунанд, морҳо ҳирс мекунанд. Механизми барҳамдиҳии усул чӣ гуна кор мекунад - 2 Ҳадафи мо оддӣ аст: аз эҷоди як қатор усулҳои овоздиҳӣ худдорӣ намоед. Ба ҷои он ки усулҳои 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 -ро пахш кунед ва аз меню " Усулҳои бекор кардани... " -ро интихоб кунед. Аз аввал ба истифодаи тугмаҳои гарм одат кунед, ин навиштани барномаҳоро суръат мебахшад! Барои муқаррар кардани рафторе, ки мо мехостем, мо якчанд корҳоро анҷом додем:
  1. Мо дар ҳар як синфи насл методеро бо ҳамон ном бо усули синфи волидайн эҷод кардем.
  2. Мо ба компилятор гуфтем, ки мо методро бо як сабабе, ки дар синфи волидайн номида будем, номбар кардем: мо мехостем рафтори онро бекор кунем. Барои ин "паём" ба компилятор, мо дар метод шарҳи @Override гузоштаем .
    Шарҳи @Override, ки дар болои усул ҷойгир шудааст, ба компилятор (ва барномасозоне, ки codeи шуморо мехонанд) мегӯяд: "Ҳама чиз хуб аст, ин хато ё фаромӯшии ман нест. Дар хотир дорам, ки чунин усул аллакай вуҷуд дорад ва ман мехоҳам онро бекор кунам."

  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();
   }
}
Натиҷаи консол: Вой! Мияв! Рррр! шшш! Аҷоиб, ҳама чиз тавре ки лозим аст, кор мекунад! Мо 4 тағирёбандаҳои истинодкунандаи синфи волидайнро эҷод кардем Animalва онҳоро ба 4 an objectи гуногуни синфҳои наслӣ таъин кардем. Дар натиҷа, ҳар як an object ба таври гуногун рафтор мекунад. Барои ҳар як синфҳои наслӣ, усули бекоршуда voice()усули "модарӣ" -ро voice()аз синф иваз кард Animal(ки танҳо "Овоз!"-ро ба консол мебарорад). Механизми барҳамдиҳии усул чӣ гуна кор мекунад - 3 Барқароркунӣ як қатор маҳдудиятҳо дорад:
  1. Усули бекоршуда бояд ҳамон аргументҳои усули волидайн дошта бошад.

    Агар метод 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!");
       }
    }

  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!");
       }
    }
Усули барҳам задан дар Java яке аз воситаҳо барои татбиқи идеяи полиморфизм мебошад (принсипи OOP, ки мо дар лексияи охир дар бораи он сӯҳбат кардем). Аз ин рӯ, бартарии асосии истифодаи он ҳамон чандирӣ хоҳад буд, ки мо дар бораи он қаблан гуфта будем. Мо метавонем як системаи содда ва мантиқии синфҳоро созем, ки ҳар кадоми онҳо рафтори мушаххас доранд (сагон аккос мекунанд, гурбаҳо мияав мекунанд), аммо бо интерфейси ягона - як усул voice()барои ҳама ба ҷои як қатор усулҳо voiceDog()ва voiceCat()ғайра .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION