JavaRush /Java Blog /Random-TK /Java-da miras vs kompozisiýa
dio
Dereje
Москва

Java-da miras vs kompozisiýa

Toparda çap edildi
Bu makala Java-da miras we kompozisiýa düşünjelerini görkezýär. Birinji mysal mirasy görkezýär, soňra kompozisiýa ulanyp miras dizaýnyny nädip gowulandyrmalydygyny görkezýär. Ahyrynda olaryň arasynda nädip saýlamalydygyny jemläris. Java-da miras vs kompozisiýa - 1

1. Miras

Biziň synpymyz bar Insect(iňlis mör-möjekleri) Bu synpda iki usul bar: 1. move()(Iňlis dilinden) we 2. attack()(Iňlis hüjüminden)
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");
	}
}
BeeIndi görnüşleriň biri bolan, ýöne dürli ýerine ýetirişleri bolan we synpy (iňlis ary ) Insectkesgitlemek isleýärsiňiz . Bu mirasy ulanmak arkaly amala aşyrylyp bilner: attack()move()
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();
	}
}
Synpyň iýerarhiýa diagrammasy gaty ýönekeý: Java-da miras vs kompozisiýa - 2ecutionerine ýetirişiň netijesi:
Fly
Fly
Attack
"Uç" iki gezek ýazylýar, şonuň üçin usul move()iki gezek diýilýär. Itöne ony diňe bir gezek çagyrmaly. Mesele sebäp bolýar super.attack(). Bu usul synp usuly attack ()diýilýär . Kiçi topar jaň edeninde , artykmaç usuly hem çagyrýar . Meseläni düzetmek üçin: move()Insectsuper.attack ()move()
  1. Kiçi synp usulyny aýyryň attack(). Bu kiçi klassy superklasyň usulynyň ýerine ýetirilmegine bagly eder attack(). Superklass hereket etmek üçin başga usul ulanyp başlasa attack()attack(), kiçi klas hem üýtgemeli bolar. Bu erbet encapsulation.
  2. Usuly attack()aşakdaky ýaly ýazyň:

    public void attack() {
    	move();
    	System.out.println("Attack");
    }
  3. Bu dogry netijäni kepillendirýär, sebäbi kiçi klas indi superklasa bagly däl. Şeýle-de bolsa, kod superklasyň dublikatydyr. (usul attack()diňe bir setir çykarmakdan has çylşyrymly zatlar edýär). Bu gowy programma üpjünçiligi dizaýny däl we iki gezek kody bolmaly däl.

Bu miras dizaýny erbet, sebäbi kiçi klas onuň superklassasynyň ýerine ýetiriş jikme-jikliklerine baglydyr. Superklas üýtgese, kiçi klas dogry işlemez.

2. Kompozisiýa

Mirasyň ýerine kompozisiýa ulanyp bilersiňiz. Geliň, bir çözgüdi göreliň. Funksiýa attack()interfeýs hökmünde abstrakt edilýär.
interface Attack {
	public void move();
	public void attack();
}
Hüjümiň dürli görnüşlerini Attack interfeýsini amala aşyrmak arkaly kesgitläp bolýar.
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);
	}
}
Hüjüm funksiýasy daşarky bolansoň, synpda Insectindi ýok.
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;
	}
}
Synp Bee(Iňlis ary dilinden), görnüşiň nädip Insecthüjüm edip biljekdigi.
// 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();
	}
}
Synp diagrammasy: Java-da miras vs kompozisiýa - 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();
	}
}
Ecutionerine ýetiriş netijesi:
fly
move
fly
sting

3. Bu çemeleşmeleri haçan ulanmaly?

Aşakdaky 2 nokat miras bilen kompozisiýanyň arasynda karar bermäge kömek edip biler:
  1. "IS" görnüşindäki synplaryň arasyndaky gatnaşyk bilen iş salyşýan bolsaňyz we bir synp ähli interfeýslerini başga bir klasa bermek islese, miras has ileri tutulýar.
  2. gatnaşyk "HAS" bolsa, kompozisiýa makul bilner.
Şeýlelik bilen, mirasyň we kompozisiýanyň öz goşundylary bar we olaryň peýdasyna düşünmeli. Salgylar:
  1. Bloch, Joşua. Netijeli java. 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 ...
Asyl makala baglanyşyk
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION