JavaRush /Blog Jawa /Random-JV /Pusaka pirang-pirang ing Jawa. Perbandingan komposisi lan...
HonyaSaar
tingkat
Москва

Pusaka pirang-pirang ing Jawa. Perbandingan komposisi lan warisan

Diterbitake ing grup
Sawetara wektu kepungkur aku nulis sawetara kiriman babagan warisan, antarmuka lan komposisi ing basa Jawa. Ing artikel iki, kita bakal nliti macem-macem warisan banjur sinau babagan keuntungan komposisi tinimbang warisan.
Pusaka pirang-pirang ing Jawa.  Perbandingan komposisi lan warisan - 1

Multiple Pusaka ing Jawa

Multiple inheritance yaiku kemampuan kanggo nggawe kelas kanthi macem-macem kelas induk. Ora kaya basa berorientasi obyek populer liyane kayata C++, Jawa ora ndhukung warisan pirang-pirang kelas. Dheweke ora ndhukung amarga kemungkinan nemoni "masalah berlian" lan luwih seneng nyedhiyakake sawetara pendekatan komprehensif kanggo ngatasi, nggunakake pilihan sing paling apik sing bisa entuk asil warisan sing padha.

"Masalah Diamond"

Kanggo ngerteni masalah berlian kanthi luwih gampang, ayo nganggep manawa warisan pirang-pirang didhukung ing Jawa. Ing kasus iki, kita bisa entuk kelas kanthi hierarki sing ditampilake ing gambar ing ngisor iki. hierarki kelas intanAyo kang nganggep sing SuperClasskelas abstrak sing njlèntrèhaké cara tartamtu, lan kelas ClassAlan ClassBkelas nyata. 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(){
    }
}
Saiki, ayo nganggep yen kelas kasebut ClassCwarisan saka ClassAlan ClassBing wektu sing padha, lan ing wektu sing padha duwe implementasine ing ngisor iki:
package com.journaldev.inheritance;
public class ClassC extends ClassA, ClassB{
    public void test(){
        //вызов метода родительского класса
        doSomething();
    }
}
Elinga yen metode kasebut test()nyebutake metode doSomething()kelas induk, sing bakal nyebabake ambiguitas amarga kompiler ora ngerti metode superclass sing kudu diarani. Amarga wangun diagram pusaka kelas ing kahanan iki, kang meh podo outline saka berlian faceted, masalah disebut "Diamond Masalah". Iki minangka alasan utama kenapa Jawa ora ndhukung warisan kelas pirang-pirang. Elinga yen masalah iki karo sawetara warisan kelas uga bisa dumadi karo telung kelas sing duwe paling siji cara umum.

Multiple warisan lan antarmuka

Sampeyan bisa uga wis ngeweruhi sing aku tansah ngandika "warisan akeh ora didhukung antarane kelas", nanging didhukung antarane antarmuka. Conto prasaja ditampilake ing ngisor iki: InterfaceA.java
package com.journaldev.inheritance;
public interface InterfaceA {

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

public interface InterfaceB {

    public void doSomething();
}
Elinga yen loro antarmuka duwe metode kanthi jeneng sing padha. Saiki ayo ngomong kita duwe antarmuka sing warisan saka loro antarmuka. InterfaceC.java
package com.journaldev.inheritance;

public interface InterfaceC extends InterfaceA, InterfaceB {

    //метод, с тем же названием описан в  InterfaceA и InterfaceB
    public void doSomething();
Kene, kabeh iku becik, wiwit antarmuka mung leladen / gambaran saka cara, lan implementasine saka cara dhewe bakal ing kelas konkrit sing ngleksanakake antarmuka iki, supaya ora ana kamungkinan kanggo nemokke ambiguity karo sawetara warisan antarmuka. Mulane kelas ing Jawa bisa diwenehi warisan saka macem-macem antarmuka. Ayo nuduhake kanthi conto ing ngisor iki. 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();
    }
}
Sampeyan bisa uga wis ngeweruhi sing saben-saben aku override cara diterangake ing superclass utawa ing antarmuka, Aku nggunakake @Override anotasi. Iki minangka salah siji saka telung anotasi Jawa sing wis dibangun lan sampeyan kudu nggunakake nalika ngatasi metode.

Komposisi minangka kawilujengan

Dadi, yen kita pengin nggunakake fungsi methodA()kelas ClassAlan methodB()kelas ClassBing ClassС? Solusi kanggo iki bisa dadi komposisi - versi sing ditulis ulang ClassCsing ngetrapake loro metode kelas ClassAlan ClassBuga duwe implementasi doSomething()kanggo salah sawijining obyek. 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();
    }
}

Komposisi utawa warisan?

Praktek pemrograman Java sing apik kanggo njupuk kauntungan saka komposisi tinimbang warisan. Kita bakal nliti sawetara aspek kanggo pendekatan iki.
  1. Contone, kita duwe kombinasi kelas induk-pewaris ing ngisor iki:

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

    Kode ing ndhuwur kompilasi lan bisa digunakake kanthi becik, nanging kepiye yen ClassCditindakake kanthi beda:

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

    Elinga yen metode kasebut test()wis ana ing kelas turunan, nanging ngasilake asil saka jinis sing beda. Saiki ClassD, yen sampeyan nggunakake IDE, ora bakal dikompilasi. Sampeyan bakal menehi saran kanggo ngganti jinis bali ing turunan utawa superclass.

    Saiki ayo bayangake kahanan sing ana warisan kelas multi-tingkat lan superclass ora kasedhiya kanggo owah-owahan kita. Saiki, kanggo nyingkirake kesalahan kompilasi, kita ora duwe pilihan liyane tinimbang ngganti tandha tangan utawa jeneng metode subkelas. Kita uga kudu nggawe pangowahan ing kabeh panggonan sing diarani metode iki. Mangkono, warisan ndadekake kode kita brittle.

    Masalah sing diterangake ing ndhuwur ora nate kedadeyan ing kasus komposisi, lan mulane ndadekake sing terakhir luwih disenengi kanggo warisan.

  2. Masalah sabanjure karo warisan yaiku kita mbukak kabeh cara wong tuwa marang klien. Lan yen superclass ora dirancang banget bener lan ngandhut bolongan keamanan. Banjur, sanajan kita njupuk care lengkap saka keamanan ing implementasine saka subclass kita, kita isih bakal gumantung ing implementasine cacat saka kelas induk.

    Komposisi mbantu kita nyedhiyakake akses sing dikontrol menyang metode superclass, dene warisan ora ngontrol cara kasebut. Iki uga minangka salah sawijining kaluwihan utama komposisi tinimbang warisan.

  3. Keuntungan liyane saka komposisi yaiku nambah keluwesan nalika nelpon metode. Implementasine kelas ClassCkasebut ing ndhuwur ora optimal lan nggunakake ikatan awal karo metode sing diarani. Owah-owahan minimal bakal ngidini kita nggawe cara nelpon fleksibel lan ngidini ikatan pungkasan (ngiket nalika runtime).

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

    Program ing ndhuwur bakal ditampilake:

    doSomething implementation of A
    doSomething implementation of B

    Keluwesan ing metode panggilan iki ora katon karo warisan, sing ndadekake komposisi minangka pendekatan sing paling apik.

  4. Pengujian unit luwih gampang ing kasus komposisi amarga kita ngerti manawa kanggo kabeh metode sing digunakake ing superclass, kita bisa stub tes, nalika ing warisan kita gumantung banget marang superclass lan ora ngerti carane metode kelas induk. bakal digunakake. Dadi, amarga warisan, kita kudu nyoba kabeh metode superclass, sing ora perlu.

    Saenipun, warisan mung kudu digunakake nalika hubungan " is-a " bener kanggo kelas wong tuwa lan anak, yen ora, komposisi kudu luwih disenengi.

Artikel asli
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION