JavaRush /Java Blog /Random-TK /Java-da köp miras. Kompozisiýa we mirasy deňeşdirmek
HonyaSaar
Dereje
Москва

Java-da köp miras. Kompozisiýa we mirasy deňeşdirmek

Toparda çap edildi
Birnäçe wagt öň Java-da miras, interfeýsler we kompozisiýa hakda birnäçe ýazgy ýazypdym. Bu makalada birnäçe mirasa serederis, soňra kompozisiýanyň mirasdan artykmaçlyklary barada öwreneris.
Java-da köp miras.  Kompozisiýa we mirasy deňeşdirmek - 1

Java-da köp miras

Birnäçe miras, köp ene-atalar synplary bilen synp döretmek ukybydyr. C ++ ýaly beýleki meşhur obýekte gönükdirilen dillerden tapawutlylykda Java birnäçe synp mirasyny goldamaýar. "Göwher meselesine" duçar bolmak ähtimallygy sebäpli muny goldamaýar we şuňa meňzeş miras netijesini gazanyp boljak iň oňat wariantlary ulanyp, ony çözmek üçin birneme giňişleýin çemeleşmegi makul bilýär.

"Göwher meselesi"

Göwher meselesine has ýönekeý düşünmek üçin, Java-da birnäçe mirasyň goldanýandygyny kabul edeliň. Bu ýagdaýda aşakdaky suratda görkezilen iýerarhiýa bilen sapak alyp bileris. Belli bir usuly, synplary we hakyky synplary beýan edýän abstrakt synpdygyny göwher synpy iýerarhiýasykabul edeliň . SuperClass ClassA ClassB SuperClass.java
package com.journaldev.inheritance;
public abstract class SuperClass {
   	public abstract void doSomething();
}
ClassA.java
package com.journaldev.inheritance;
public class ClassA extends SuperClass{
    @Override
 public void doSomething(){
        System.out.println("Какая-то реализация класса A");
    }
  //собственный метод класса  ClassA
    public void methodA(){
    }
}
Indi, synpyň şol bir wagtyň özünde ClassCmiras alýandygyny we şol bir wagtyň özünde aşakdaky ýerine ýetirişiň bardygyny kabul edeliň : ClassA ClassB
package com.journaldev.inheritance;
public class ClassC extends ClassA, ClassB{
    public void test(){
        //вызов метода родительского класса
        doSomething();
    }
}
Usulyň ene synpyň test()usuly diýilýändigine üns beriň doSomething(), bu düşnüksizlige sebäp bolar, sebäbi düzüji haýsy superklass usulynyň çagyrylmalydygyny bilenok. Bir taraply göwheriň çyzgysyna meňzeýän bu ýagdaýda synp miras diagrammasynyň görnüşi sebäpli bu meselä “Almaz meselesi” diýilýär. Java-yň birnäçe synp mirasyny goldamaýandygynyň esasy sebäbi. Birnäçe synp mirasy bilen baglanyşykly bu meseläniň azyndan bir umumy usuly bolan üç synp bilen hem bolup biljekdigine üns beriň.

Birnäçe miras we interfeýs

Elmydama "synplaryň arasynda köp miras goldanylmaýar" diýýändigimi gören bolmagyňyz mümkin, ýöne interfeýsleriň arasynda goldanýar. Aşakda ýönekeý mysal görkezilýär: InterfaceA.java
package com.journaldev.inheritance;
public interface InterfaceA {

    public void doSomething();
}
InterfaceB.java
package com.journaldev.inheritance;

public interface InterfaceB {

    public void doSomething();
}
Iki interfeýsiň hem şol bir at bilen usulynyň bardygyna üns beriň. Indi iki interfeýsden miras galan interfeýsimiz bar diýeliň. InterfaceC.java
package com.journaldev.inheritance;

public interface InterfaceC extends InterfaceA, InterfaceB {

    //метод, с тем же названием описан в  InterfaceA и InterfaceB
    public void doSomething();
Bu ýerde hemme zat ideal, sebäbi interfeýsler diňe bir usulyň ätiýaçlandyryşy / beýanydyr we usulyň durmuşa geçirilmegi bu interfeýsleri amala aşyrýan anyk synpda bolar, şonuň üçin interfeýsleriň köp mirasy bilen düşnüksizlige duçar bolmaz. Şonuň üçin Java-daky sapaklar birnäçe interfeýsden miras alyp biler. Aşakdaky mysal bilen görkezeliň. InterfacesImpl.java
package com.journaldev.inheritance;

public class InterfacesImpl implements InterfaceA, InterfaceB, InterfaceC {

    @Override
    public void doSomething() {
        System.out.println("doSomething реализация реального класса ");
    }

    public static void main(String[] args) {
        InterfaceA objA = new InterfacesImpl();
        InterfaceB objB = new InterfacesImpl();
        InterfaceC objC = new InterfacesImpl();

        //все вызываемые ниже методы получат одинаковую реализацию конкретного класса

        objA.doSomething();
        objB.doSomething();
        objC.doSomething();
    }
}
Her gezek superklasda ýa-da interfeýsde beýan edilen usuly ýok edenimde, @Override düşündirişini ulanýandygymy gören bolmagyňyz mümkin. Bu, gurlan Java üç düşündirişiň biridir we usullary aşa ýok edende elmydama ulanmaly.

Halas ediş hökmünde kompozisiýa

methodA()Onda synp ClassAwe methodB()synp funksiýasyny ClassBulanmak islesek näme etmeli ClassС? Munuň çözgüdi kompozisiýa bolup biler - ClassCsynp usullaryny hem ýerine ýetirýän ClassAwe obýektleriň biri üçin ClassBdurmuşa geçirilýän täzeden ýazylan wersiýa. doSomething() ClassC.java
package com.journaldev.inheritance;

public class ClassC{

    ClassA objA = new ClassA();
    ClassB objB = new ClassB();

    public void test(){
        objA.doSomething();
    }

    public void methodA(){
        objA.methodA();
    }

    public void methodB(){
        objB.methodB();
    }
}

Kompozisiýa ýa-da miras?

Mirasdan has köp kompozisiýadan peýdalanmak üçin Java programmirleme amaly. Bu çemeleşmäniň peýdasyna käbir taraplara serederis.
  1. Ene-ata-miras synplarynyň aşakdaky utgaşmasy bar diýeliň:

    ClassC.java

    package com.journaldev.inheritance;
    
    public class ClassC{
    
    public void methodC(){
      	}
    
    }

    ClassD.java

    package com.journaldev.inheritance;
    
    public class ClassD extends ClassC{
    
        public int test(){
            return 0;
        }
    }

    Aboveokardaky kod düzýär we gowy işleýär, ýöne ClassCbaşgaça ýerine ýetirilen bolsa näme etmeli:

    package com.journaldev.inheritance;
    
    public class ClassC{
    
        public void methodC(){
        }
    
        public void test(){
        }
    }

    Usulyň test()nesil synpynda eýýäm bar, ýöne başga bir görnüşiň netijesini berýär. Indi ClassDIDE ulanýan bolsaňyz, düzülmez. Size nesil ýa-da superklasda gaýdyp geliş görnüşini üýtgetmek maslahat berler.

    Indi synplaryň köp derejeli mirasy bolan we üýtgeşmelerimiz üçin superklassyň elýeterli bolmadyk ýagdaýyny göz öňüne getireliň. Indi, düzmek ýalňyşlygyndan dynmak üçin, kiçi klass usulynyň goluny ýa-da adyny üýtgetmekden başga alajymyz ýok. Şeýle hem bu usulyň atlandyrylan ýerlerine üýtgeşmeler girizmeli bolarys. Şeýlelik bilen, miras kodumyzy döwýär.

    Aboveokarda beýan edilen mesele kompozisiýa meselesinde hiç haçan ýüze çykmaýar we şonuň üçin ikinjisini mirasdan ileri tutýar.

  2. Miras bilen baglanyşykly indiki mesele, ene-atanyň ähli usullaryny müşderä açmagymyzdyr. Eger superklas gaty dogry düzülmedik bolsa we howpsuzlyk deşikleri bar bolsa. Soň bolsa, kiçi synpymyzy durmuşa geçirmekde howpsuzlyk barada doly alada etsek-de, ene-atalar synpynyň kemçilikli durmuşa geçirilmegine bagly bolarys.

    Kompozisiýa, superklassyň usullaryna gözegçilik edilýän elýeterliligi üpjün etmäge kömek edýär, miras bolsa onuň usullaryna hiç hili gözegçilik edip bilmeýär. Bu hem kompozisiýanyň mirasa garanyňda esasy artykmaçlyklaryndan biridir.

  3. Kompozisiýanyň başga bir peýdasy, çagyryş usullaryna çeýeligi goşýar. Aboveokarda beýan edilen synpyň durmuşa geçirilmegi ClassCamatly däl we atlandyrylan usul bilen irki baglanyşygy ulanýar. Iň az üýtgeşmeler, çeýe çagyryş usulyny döretmäge we giç baglanmaga mümkinçilik berer (iş wagty hökmany).

    ClassC.java

    package com.journaldev.inheritance;
    public class ClassC{
        SuperClass obj = null;
        public ClassC(SuperClass o){
            this.obj = o;
        }
        public void test(){
            obj.doSomething();
        }
    
        public static void main(String args[]){
            ClassC obj1 = new ClassC(new ClassA());
            ClassC obj2 = new ClassC(new ClassB());
    
            obj1.test();
            obj2.test();
        }
    }

    Aboveokardaky programma görkeziler:

    doSomething implementation of A
    doSomething implementation of B

    Usuly çagyrmagyň bu çeýeligi kompozisiýany iň oňat çemeleşýän miras bilen görünmeýär.

  4. Bölüm synagy kompozisiýa meselesinde has aňsat, sebäbi superklasda ulanylýan ähli usullar üçin synaglary ýapyp biljekdigimizi bilýäris, mirasda bolsa superklassa köp bagly we ene-atalar synpynyň usullaryny bilmeýäris. ulanylar. Şeýlelik bilen, miras sebäpli, zerur däl iş bolan superklasyň ähli usullaryny barlamaly bolarys.

    Iň gowusy, miras diňe ene-atalar we çagalar synplary üçin “ is-a ” gatnaşygy dogry bolanda ulanylmaly , ýogsam kompozisiýa ileri tutulmalydyr.

Asyl makala
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION