JavaRush /Java Blog /Random-TK /Usuly ýokaşdyrmak mehanizmi ýa-da Java-da ýokaşdyrmak

Usuly ýokaşdyrmak mehanizmi ýa-da Java-da ýokaşdyrmak

Toparda çap edildi
Salam! Java-da eýýäm usullary ulanýarsyňyz we olar hakda köp zat bilýärsiňiz. Bir synpda birmeňzeş, ýöne dürli argumentli usullaryň köp bolan ýagdaýyna duş gelen bolsaňyz gerek. .Adyňyzda bolsa, şol ýagdaýlarda artykmaç ýüklemek usulyny ulanýardyk. Bu gün başga bir ýagdaýa seredeliň. Bir umumy usulymyzyň bardygyny göz öňüne getiriň, ýöne haýsy klasa çagyrylandygyna baglylykda dürli zatlar etmeli. Bu özüni alyp barşy nädip durmuşa geçirmeli? Muny anyklamak üçin geliň, Animalhaýwanlary aňladýan ene-atalar synpyny alalyň we onda bir usul döredeliň voice- “ ses ”:
public class Animal {

   public void voice() {

       System.out.println("Voice!");
   }
}
Programmany ýaňy ýazyp başlasak-da, ýüze çykyp biläýjek meseläni görüp bilersiňiz: dünýäde haýwanlar kän we olaryň hemmesi başgaça “gürleýärler”: pişikler meow, ördekler, ýylanlar pyşyrdýarlar. Usuly ýok etmegiň usuly nähili işleýär - 2 Biziň maksadymyz ýönekeý: ses bermek üçin bir topar usul döretmekden saklanyň. voiceCat()Kesmek, voiceSnake()pyşyrdamak we ş.m. usullary döretmegiň ýerine voice(), ýylanyň pyşyrdamagyny, usul diýlende itiň üýrmegini isleýäris. Usuly ýokaşdyrmak mehanizmini ulanyp, aňsatlyk bilen gazanyp bileris (Java-da override) . Wikipediýa “artykmaçlyk” adalgasynyň aşakdaky düşündirişini berýär: Obýekte gönükdirilen programmirleme usuly, kiçi klasa ýa-da çaga synpyna superklaslaryň birinde eýýäm ýerine ýetirilen usulyň belli bir ýerine ýetirilmegini üpjün etmäge mümkinçilik berýän programma diliniň aýratynlyklaryndan biridir. ýa-da ene-atalar sapaklary. Umuman, dogry. Artykmaçlyk ene-atalar synpynyň usulyny almaga we bu usulyň durmuşa geçirilişini her nesil synpynda ýazmaga mümkinçilik berýär. Täze durmuşa geçirmek, ene-atany çaga synpynda "çalşar". Mysal bilen munuň nähili bolýandygyny göreliň. Geliň, synpymyz üçin 4 sany yzygiderli synp döredeliň : 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("Ш-ш-ш!");
   }
}
Geljek üçin kiçijik durmuş hakeri: ene synpyň usullaryny ýok etmek, Intellij IDE a-da nesil synpynyň koduna geçmek, Ctrl + O basyň we menýudan “ Usullary ýok ... ” saýlaň. Ilkibaşdan düwmejikleri ulanmaga öwrenişiň, ýazuw programmalaryny çaltlaşdyrar! Islän häsiýetimizi kesgitlemek üçin birnäçe zatlar etdik:
  1. Her nesil synpynda ene synpdaky usul bilen birmeňzeş at döretdik.
  2. Kompilýora, bir sebäbe görä usulyň ene synpdaky ýaly at dakandygyny aýtdyk: onuň özüni alyp barşyny ýok etmek isledik. Düzüjä bu “habar” üçin usula @Override düşündiriş goýýarys .
    Usulyň üstünde ýerleşdirilen @Override düşündiriş düzüjä (we koduňyzy okaýan programmistlere) şeýle diýýär: “Hemme zat gowy, bu ýalňyşlyk ýa-da ýatdan çykarylma. Şeýle usulyň eýýäm barlygy ýadyma düşýär we ony ýok etmek isleýärin ".

  3. Her nesil synpy üçin zerur ýerine ýetiriş ýazdyk. Çagyrylanda ýylan voice()gygyrmaly, aýy möňňürmeli we ş.m.
Programmada munuň nähili işlejekdigini göreliň:
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();
   }
}
Konsol çykyşy: Woof! Meow! Rrrr! Şhh! Gowy, hemme zat bolmalysy ýaly işleýär! Ene synpyň 4 salgylanma üýtgeýjisini döretdik Animalwe olary nesil synplarynyň 4 dürli obýektine belledik. Netijede, her bir zat başgaça hereket edýär. Nesil synplarynyň her biri üçin artykmaç usul synpdan voice()“ýerli” usulyny çalyşdy (diňe “Ses!” Konsoluna çykýar). Artykmaçlygyň birnäçe çäklendirmeleri bar: voice()AnimalUsuly ýok etmegiň usuly nähili işleýär - 3
  1. Artykmaç usulda ene-atanyň usuly ýaly argumentler bolmaly.

    voiceEne-atalar synpyndaky bir usul giriş hökmünde kabul edilse String, çaga synpynda ýokaşdyrylan usul hem giriş hökmünde kabul edilmelidir String, ýogsam düzüji ýalňyşlyk goýberer:

    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. Artykmaç usul ene-atanyň usuly bilen birmeňzeş bolmaly.

    Otherwiseogsam, düzmek ýalňyşlygy alarys:

    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. Artykmaç usulyň giriş üýtgedijisi hem “asyl” usuldan tapawutlanyp bilmez:

    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-da usuly ýokaşdyrmak polimorfizm ideýasyny durmuşa geçirmek üçin gurallaryň biridir (soňky leksiýada gürleşen OOP prinsipimiz). Şonuň üçin ony ulanmagyň esasy artykmaçlygy, ozal aýdyp geçen çeýeligimiz bolar. Classesönekeý we logiki synp ulgamyny gurup bileris, olaryň hersinde aýratyn häsiýet bolar (itler üýrýär, pişikler), ýöne ýekeje interfeýs bilen - bir voice()topar usulyň ýerine hemmeler üçin bir usul voiceDog()we voiceCat()ş.m.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION