JavaRush /Java Blog /Random-TK /Java-da köp miras. Kompozisiýa vs. Miras
DSergey_Kh
Dereje

Java-da köp miras. Kompozisiýa vs. Miras

Toparda çap edildi

Java-da köp miras

Birnäçe miras, birnäçe superklasdan miras galan synp döretmäge mümkinçilik berýär. C ++ ýaly käbir meşhur obýekte gönükdirilen programmirleme dillerinden tapawutlylykda Java sapaklardan köp mirasa rugsat bermeýär. Java köp synp mirasyny goldamaýar, sebäbi göwher meselesine sebäp bolup biler. Bu meseläni çözmegiň ýollaryny gözlemegiň ýerine, köp miras ýaly birmeňzeş netijäni gazanyp boljak has gowy wariantlar bar.

Göwher meselesi

Göwher meselesine has aňsat düşünmek üçin, Java-da birnäçe mirasyň goldanýandygyny kabul edeliň. Bu ýagdaýda aşakdaky suratda görkezilişi ýaly synp iýerarhiýasy bolup biler. Java-da köp miras.  Kompozisiýa we miras - 1Synpyň SuperClassabstraktdygyny we onda käbir usulyň yglan edilendigini kabul edeliň. Beton synplar ClassAwe ClassB.
package com.journaldev.inheritance;
public abstract class SuperClass {
	public abstract void doSomething();
}
package com.journaldev.inheritance;
public class ClassA extends SuperClass{
	@Override
	public void doSomething(){
		System.out.println("doSomething implementation of A");
	}
	//ClassA own method
	public void methodA(){
	}
}
package com.journaldev.inheritance;
public class ClassB extends SuperClass{
	@Override
	public void doSomething(){
		System.out.println("doSomething implementation of B");
	}
	//ClassB specific method
	public void methodB(){
	}
}
ClassCIndi durmuşa geçirmek we miras almak ClassAisleýäris öýdýän ClassB.
package com.journaldev.inheritance;
public class ClassC extends ClassA, ClassB{
	public void test(){
		//calling super class method
		doSomething();
	}
}
Usulyň test()superklass usuly diýilýändigine üns beriň doSomething(). Bu düşnüksizlige sebäp bolýar, sebäbi düzüji haýsy superklass usulyny ýerine ýetirmelidigini bilenok. Bu göwher meselesi diýilýän göwher şekilli diagramma. Java-yň köp mirasy goldamagynyň esasy sebäbi şu. Birnäçe synp mirasy bilen ýokardaky meseläniň diňe azyndan bir umumy usuly bolan üç synp bilen bolup biljekdigine üns beriň.

Birnäçe interfeýs mirasy

Java-da köp miras synplarda goldanylmaýar, ýöne interfeýslerde goldanýar. Bir interfeýs başga-da köp interfeýsi giňeldip biler. Aşakda ýönekeý bir mysal getirilýär.
package com.journaldev.inheritance;
public interface InterfaceA {
	public void doSomething();
}
package com.journaldev.inheritance;
public interface InterfaceB {
	public void doSomething();
}
Iki interfeýsiň hem şol bir usuly yglan edýändigine üns beriň. Indi aşakdaky mysalda görkezilişi ýaly bu interfeýsleriň ikisini hem uzadýan interfeýs döredip bileris.
package com.journaldev.inheritance;
public interface InterfaceC extends InterfaceA, InterfaceB {
	//same method is declared in InterfaceA and InterfaceB both
	public void doSomething();
}
Bu gaty gowy işleýär, sebäbi interfeýsler diňe usullary yglan edýär we ýerine ýetiriş interfeýsi miras alýan synplarda amala aşyrylar. Şeýlelik bilen, köp interfeýs mirasynda düşnüksizlige ýol ýok.
package com.journaldev.inheritance;
public class InterfacesImpl implements InterfaceA, InterfaceB, InterfaceC {
	@Override
	public void doSomething() {
		System.out.println("doSomething implementation of concrete class");
	}
	public static void main(String[] args) {
		InterfaceA objA = new InterfacesImpl();
		InterfaceB objB = new InterfacesImpl();
		InterfaceC objC = new InterfacesImpl();

		//all the method calls below are going to same concrete implementation
		objA.doSomething();
		objB.doSomething();
		objC.doSomething();
	}
}
Haçan-da haýsydyr bir superklass usulyny ýok etseňiz ýa-da interfeýs usulyny ulansaňyz, düşündiriş ulanyň @Override. methodA()Bir synpyň funksiýasyny we synpda bir synpyň ClassAfunksiýasyny ulanmak islesek näme etmeli ? Çözüw kompozisiýany ulanmakdan ybarat. Aşakda synp usullaryny we obýektleriň biriniň usulyny kesgitlemek üçin kompozisiýany ulanýan görnüşi bar .methodB()ClassBClassCClassCdoSomething()
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 vs. Miras

Java programmirlemegiň iň oňat usullaryndan biri, “mirasdan ozal kompozisiýany tassyklamak”. Bu çemeleşmäni goldaýan käbir taraplary öwreneris.
  1. Superklass we ony uzaldýan synpymyz bar diýeliň:

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

    Aboveokardaky kod düzýär we gowy işleýär. ClassCEmma, ​​aşakda görkezilişi ýaly synpyň ýerine ýetirilişini üýtgetsek näme etmeli :

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

    Usulyň test()kiçi klasda eýýäm bardygyna üns beriň, ýöne gaýtarmagyň görnüşi başga. Indi synp ClassDdüzülmez we haýsydyr bir IDE ulansaňyz, superklasda ýa-da kiçi klassda gaýdyp geliş görnüşini üýtgetmegiňizi sorar.

    Indi köp derejeli miras iýerarhiýamyz we superklassa girip bilmeýän ýagdaýymyzy göz öňüne getiriň. Toplama ýalňyşlygyny aýyrmak üçin kiçi klass usulymyzyň goluny ýa-da adyny üýtgetmekden başga alajymyz bolmaz. Şeýle hem, kiçi klass usulyny atlandyrylýan ähli ýerlerde üýtgetmeli bolarys. Şeýlelik bilen, miras kodumyzy döwýär.

    Aboveokardaky mesele hiç haçan kompozisiýa bilen bolmaz we bu ony mirasa has özüne çekiji edýär.

  2. Miras bilen baglanyşykly başga bir mesele, superklassyň ähli usullaryny müşderä paş etmegimiz we superklassymyz dogry düzülmedik bolsa we howpsuzlyk deşikleri bar bolsa, synpymyzy iň gowy durmuşa geçirsek-de, erbet durmuşa geçirilmegi bize täsir edýär superklas Kompozisiýa, superklass usullaryna gözegçilik edilýän elýeterliligi üpjün etmekde bize kömek edýär, miras bolsa superklas usullaryna gözegçilik etmeýär. Bu hem kompozisiýanyň mirasdan esasy peýdalaryndan biridir.

  3. Kompozisiýanyň başga bir artykmaçlygy, çagyryş usullarynda çeýeligi üpjün etmegidir. Aboveokarda görkezilen synpy amala aşyrmagymyz ClassCamatly däl we jemleniş wagtynyň çagyryljak usula baglydygyny üpjün edýär. Iň az üýtgeşmeler bilen usuly çeýe we dinamiki edip bileris.

    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();
    	}
    }

    Aboveokarda görkezilen programmanyň netijesi:

    doSomething implementation of A
    doSomething implementation of B

    Usuly çagyrmagyň bu çeýeligi, kompozisiýa saýlamasyna başga bir artykmaçlyk berýän miras bilen elýeterli däl.

  4. Bölüm synagyny kompozisiýa bilen ýerine ýetirmek has aňsat, sebäbi superklasdan ähli usullary ulanýandygymyzy we synag üçin göçürip biljekdigimizi bilýäris. Mirasda bolsa, superklassa has köp bagly bolýarys we ulanyljak superklasyň ähli usullaryny bilemzok. Şonuň üçin miras sebäpli goşmaça iş bolan superklasyň ähli usullaryny barlamaly bolýarys.

    Iň gowusy, diňe superklass gatnaşyklary üçin kiçi klass "bolşy" kesgitlenende mirasy ulanmalydyrys. Beýleki ähli ýagdaýlarda kompozisiýany ulanmak maslahat berilýär.

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