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.
1. Miras
Biziň synpymyz barInsect
(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");
}
}
Bee
Indi görnüşleriň biri bolan, ýöne dürli ýerine ýetirişleri bolan we synpy (iňlis ary ) Insect
kesgitlemek 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ý: ecutionerine ý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()
Insect
super.attack ()
move()
- Kiçi synp usulyny aýyryň
attack()
. Bu kiçi klassy superklasyň usulynyň ýerine ýetirilmegine bagly ederattack()
. Superklass hereket etmek üçin başga usul ulanyp başlasaattack()attack()
, kiçi klas hem üýtgemeli bolar. Bu erbet encapsulation. -
Usuly
attack()
aşakdaky ýaly ýazyň:public void attack() { move(); System.out.println("Attack"); }
-
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.
2. Kompozisiýa
Mirasyň ýerine kompozisiýa ulanyp bilersiňiz. Geliň, bir çözgüdi göreliň. Funksiýaattack()
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 Insect
indi ý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 Insect
hü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:
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:- "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.
- gatnaşyk "HAS" bolsa, kompozisiýa makul bilner.
- Bloch, Joşua. Netijeli java. 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