Artikel iki nggambarake konsep warisan lan komposisi ing basa Jawa. Conto pisanan nuduhake warisan banjur nuduhake carane nambah desain pusaka nggunakake komposisi. Kita bakal ngringkes carane milih ing antarane ing pungkasan.
1. Pusaka
Ayo nganggep yen kita duwe kelasInsect
(serangga Inggris) Kelas iki ngemot rong cara: 1. move()
(saka Inggris move) lan 2. attack()
(saka serangan Inggris)
class Insect {
private int size;
private String color;
public Insect(int size, String color) {
this.size = size;
this.color = color;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public void move() {
System.out.println("Move");
}
public void attack() {
move(); //assuming an insect needs to move before attacking
System.out.println("Attack");
}
}
Saiki sampeyan pengin nemtokake kelas Bee
(tawon Inggris), sing minangka salah sawijining jinis Insect
, nanging nduweni implementasine attack()
lan move()
. Iki bisa ditindakake kanthi nggunakake warisan:
class Bee extends Insect {
public Bee(int size, String color) {
super(size, color);
}
public void move() {
System.out.println("Fly");
}
public void attack() {
move();
super.attack();
}
}
public class InheritanceVSComposition {
public static void main(String[] args) {
Insect i = new Bee(1, "red");
i.attack();
}
}
Diagram hierarki kelas cukup prasaja: Asil eksekusi:
Fly
Fly
Attack
"Fly" diketik kaping pindho, mula cara kasebut move()
diarani kaping pindho. Nanging kudu diarani mung sapisan. Masalah kasebut disebabake dening super.attack()
. Metode kasebut attack ()
diarani metode move()
kelas Insect
. Nalika subclass nelpon super.attack ()
, iku uga nelpon cara overridden move()
. Kanggo ndandani masalah kita bisa:
- Ngilangi
attack()
metode subclass. Iki bakal nggawe subclass gumantung ingattack()
implementasine metode superclass. Yenattack()attack()
superclass wiwit nggunakake cara sing beda kanggo obah, subclass uga kudu diganti. Iki encapsulation ala. -
Tulis maneh cara
attack()
kaya ing ngisor iki:public void attack() { move(); System.out.println("Attack"); }
-
Iki njamin asil sing bener amarga subclass ora gumantung ing superclass. Nanging, kode kasebut minangka duplikat saka superclass. (cara
attack()
nindakake perkara sing luwih rumit tinimbang mung ngetokake senar). Iki dudu desain piranti lunak sing apik lan ora ana kode duplikat.
2. Komposisi
Sampeyan bisa nggunakake komposisi tinimbang warisan. Ayo goleki solusi nggunakake. Fungsi kasebutattack()
abstrak minangka antarmuka.
interface Attack {
public void move();
public void attack();
}
Jinis serangan sing beda-beda bisa ditetepake kanthi ngetrapake antarmuka Serangan.
class AttackImpl implements Attack {
private String move;
private String attack;
public AttackImpl(String move, String attack) {
this.move = move;
this.attack = attack;
}
@Override
public void move() {
System.out.println(move);
}
@Override
public void attack() {
move();
System.out.println(attack);
}
}
Wiwit fungsi serangan njaba, kelas Insect
ora ana maneh.
class Insect {
private int size;
private String color;
public Insect(int size, String color) {
this.size = size;
this.color = color;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
Kelas Bee
(saka Inggris Bee), carane jinis Insect
bisa nyerang.
// This wrapper class wrap an Attack object
class Bee extends Insect implements Attack {
private Attack attack;
public Bee(int size, String color, Attack attack) {
super(size, color);
this.attack = attack;
}
public void move() {
attack.move();
}
public void attack() {
attack.attack();
}
}
Diagram kelas:
public class InheritanceVSComposition2 {
public static void main(String[] args) {
Bee a = new Bee(1, "black", new AttackImpl("fly", "move"));
a.attack();
// if you need another implementation of move()
// there is no need to change Insect, we can quickly use new method to attack
Bee b = new Bee(1, "black", new AttackImpl("fly", "sting"));
b.attack();
}
}
Hasil eksekusi:
fly
move
fly
sting
3. Nalika nggunakake pendekatan kasebut?
2 poin ing ngisor iki bisa mbantu sampeyan mutusake antarane warisan lan komposisi:- Yen sampeyan ana hubungane karo kelas ing wangun "IS" lan kelas pengin nyedhiyani kabeh antarmuka kanggo kelas liyane, banjur warisan luwih.
- yen hubungan "wis", banjur komposisi disenengi.
- Blok, Joshua. Jawa efektif. Pearson Education India, 2008
- https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance
- https://www.javaworld.com/article/2076814/core-java/inheritance-versus-composition--which-one-should...
GO TO FULL VERSION