JavaRush /Блоги Java /Random-TG /Мерос ва таркиб дар Java
dio
Сатҳи
Москва

Мерос ва таркиб дар Java

Дар гурӯҳ нашр шудааст
Ин мақола мафҳумҳои мерос ва таркибро дар Java нишон медиҳад. Мисоли аввал меросро нишон медиҳад ва сипас нишон медиҳад, ки чӣ гуна тарҳрезии меросро бо истифода аз таркиб беҳтар кардан мумкин аст. Мо дар охири онҳо чӣ гуна интихоб кардани онҳоро ҷамъбаст хоҳем кард. Мерос ва таркиб дар Java - 1

1. Мерос

Фарз мекунем, ки мо синф дорем Insect(ҳашароти англисӣ) Ин синф ду усулро дар бар мегирад: 1. move()(аз забони англисӣ move) ва 2. attack()(аз ҳамлаи англисӣ)
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(заббури англисӣ) муайян кунед, ки яке аз намудҳост Insect, вале татбиқҳои гуногуни 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();
	}
}
Диаграммаи иерархияи синф хеле содда аст: Мерос ва таркиб дар Java - 2Натиҷаи иҷро:
Fly
Fly
Attack
"Парвоз" ду маротиба чоп карда мешавад, бинобар ин усул move()ду маротиба даъват карда мешавад. Аммо он бояд танҳо як маротиба даъват карда шавад. Мушкилот аз сабаби super.attack(). Усул усули синфро attack ()даъват мекунад . Вақте ки зерсинф занг мезанад , он инчунин усули бекоркардаро даъват мекунад . Барои ислоҳ кардани мушкилот мо метавонем: move()Insectsuper.attack ()move()
  1. Усули зерсинфро нест кунед attack(). attack()Ин зерсинфро аз татбиқи усули суперкласс вобаста месозад . Агар attack()attack()суперсинф усули дигарро барои ҳаракат оғоз кунад, зерсинф низ бояд тағир ёбад. Ин капсуласияи бад аст.
  2. Усули attack()зеринро аз нав нависед:

    public void attack() {
    	move();
    	System.out.println("Attack");
    }
  3. Ин натиҷаи дурустро кафолат медиҳад, зеро зерсинф дигар аз суперкласс вобаста нест. Аммо, code нусхаи суперкласс аст. (усул attack()на танҳо баровардани сатр корҳои мураккабтарро иҷро мекунад). Ин тарҳи хуби нармафзор нест ва набояд рамзи такрорӣ вуҷуд дошта бошад.

Ин тарҳи мерос бад аст, зеро зерсинф аз ҷузъиёти татбиқи суперкласси он вобаста аст. Агар суперкласс тағир ёбад, зерсинф дуруст кор намекунад.

2. Таркиб

Шумо метавонед таркибро ба ҷои мерос истифода баред. Биёед ҳалли онро бо истифода аз он бубинем. Функсия attack()ҳамчун интерфейс абстракт карда шудааст.
interface Attack {
	public void move();
	public void attack();
}
Намудҳои гуногуни ҳамларо тавассути татбиқи интерфейси Attack муайян кардан мумкин аст.
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);
	}
}
Азбаски функсияи ҳамла беруна аст, синф Insectдигар онро дар бар намегирад.
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;
	}
}
Синф Bee(аз забони англисӣ Bee), чӣ гуна навъи Insectметавонад ҳамла кунад.
// 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();
	}
}
Диаграммаи синф: Мерос ва таркиб дар Java - 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();
	}
}
Натиҷаи иҷро:
fly
move
fly
sting

3. Ин равишҳоро кай бояд истифода кард?

2 нуқтаи зерин метавонанд ба шумо дар интихоби мерос ва таркиб кӯмак расонанд:
  1. Агар шумо бо муносибати байни синфҳои шакли "IS" сарукор дошта бошед ва синф мехоҳад ҳамаи интерфейсҳои худро ба синфи дигар таъмин кунад, пас мерос беҳтар аст.
  2. агар муносибат "ҲАС" бошад, пас таркиб афзалият дода мешавад.
Ҳамин тариқ, мерос ва таркиб барномаҳои худро доранд ва барои фаҳмидани арзишҳои онҳо зарур аст. Пайвандҳо:
  1. Блок, Ҷошуа. 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...
Истинод ба мақолаи аслӣ Тарҷума
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION