JavaRush /Blog Jawa /Random-JV /Pusaka vs komposisi ing Jawa
dio
tingkat
Москва

Pusaka vs komposisi ing Jawa

Diterbitake ing grup
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. Pusaka vs Komposisi ing Jawa - 1

1. Pusaka

Ayo nganggep yen kita duwe kelas Insect(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: Pusaka vs Komposisi ing Jawa - 2Asil 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:
  1. Ngilangi attack()metode subclass. Iki bakal nggawe subclass gumantung ing attack()implementasine metode superclass. Yen attack()attack()superclass wiwit nggunakake cara sing beda kanggo obah, subclass uga kudu diganti. Iki encapsulation ala.
  2. Tulis maneh cara attack()kaya ing ngisor iki:

    public void attack() {
    	move();
    	System.out.println("Attack");
    }
  3. 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.

Desain warisan iki ala amarga subclass gumantung ing rincian implementasine saka superclass sawijining. Yen superclass diganti, subclass ora bakal bisa digunakake kanthi bener.

2. Komposisi

Sampeyan bisa nggunakake komposisi tinimbang warisan. Ayo goleki solusi nggunakake. Fungsi kasebut attack()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 Insectora 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 Insectbisa 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: Pusaka vs Komposisi ing Jawa - 3
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:
  1. Yen sampeyan ana hubungane karo kelas ing wangun "IS" lan kelas pengin nyedhiyani kabeh antarmuka kanggo kelas liyane, banjur warisan luwih.
  2. yen hubungan "wis", banjur komposisi disenengi.
Mangkono, warisan lan komposisi duwe aplikasi dhewe lan kudu dimangerteni manfaate. Pranala:
  1. Blok, Joshua. Jawa efektif. Pearson Education India, 2008
  2. https://stackoverflow.com/questions/49002/prefer-composition-over-inheritance
  3. https://www.javaworld.com/article/2076814/core-java/inheritance-versus-composition--which-one-should...
Link menyang artikel asli Translated
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION