JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ وراثت بمقابله ساخت
dio
سطح
Москва

جاوا ۾ وراثت بمقابله ساخت

گروپ ۾ شايع ٿيل
هي مضمون جاوا ۾ وراثت ۽ ساخت جي تصورات کي بيان ڪري ٿو. پهريون مثال وراثت کي ظاهر ڪري ٿو ۽ پوء ڏيکاري ٿو ته ساخت کي استعمال ڪندي وراثت جي ڊيزائن کي ڪيئن بهتر بڻايو وڃي. اسان اختصار ڪنداسين ته آخر ۾ انهن جي وچ ۾ ڪيئن چونڊيو وڃي. جاوا ۾ وراثت بمقابله ساخت - 1

1. وراثت

اچو ته فرض ڪريون ته اسان وٽ هڪ طبقو آهي Insect(انگريزي حشرات) هن ڪلاس ۾ ٻه طريقا آهن: 1. 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) جي وضاحت ڪرڻ چاھيو ٿا 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();
	}
}
ڪلاس جي درجي بندي جو خاڪو بلڪل سادو آهي: جاوا ۾ وراثت بمقابله ساخت - 2عمل جو نتيجو:
Fly
Fly
Attack
"فلائي" ٻه ڀيرا ٽائپ ڪيو ويو آهي، تنهنڪري طريقو move()ٻه ڀيرا سڏيو ويندو آهي. پر اهو صرف هڪ ڀيرو سڏڻ گهرجي. مسئلو جي سبب آهي super.attack(). طريقو attack ()هڪ move()طبقي جو طريقو سڏيندو آهي Insect. جڏهن هڪ ذيلي ڪلاس ڪال ڪري ٿو super.attack ()، اهو پڻ سڏي ٿو اوور رائڊ ٿيل طريقو move(). مسئلو حل ڪرڻ لاءِ اسان ڪري سگھون ٿا:
  1. ذيلي طبقي جو طريقو ختم ڪريو attack(). هي ذيلي ڪلاس کي سپر ڪلاس جي طريقي تي عمل ڪرڻ تي منحصر ڪندو attack(). جيڪڏهن attack()attack()سپر ڪلاس هلڻ لاءِ ڪو مختلف طريقو استعمال ڪرڻ شروع ڪري ٿو، ته ذيلي ڪلاس کي به تبديل ڪرڻو پوندو. هي خراب encapsulation آهي.
  2. هن طريقي attack()سان ٻيهر لکو:

    public void attack() {
    	move();
    	System.out.println("Attack");
    }
  3. اهو صحيح نتيجو جي ضمانت ڏئي ٿو ڇو ته ذيلي ڪلاس هاڻي سپر ڪلاس تي منحصر ناهي. بهرحال، ڪوڊ سپر ڪلاس جو نقل آهي. (طريقو attack()صرف هڪ تار ڪڍڻ کان وڌيڪ پيچيده شيون ڪندو آهي). اهو سٺو سافٽ ويئر ڊزائين ناهي ۽ ڪو به نقل ڪوڊ نه هجڻ گهرجي.

هي ميراثي ڊيزائن خراب آهي ڇاڪاڻ ته ذيلي ڪلاس ان جي سپر ڪلاس جي عمل درآمد جي تفصيل تي منحصر آهي. جيڪڏهن سپر ڪلاس تبديل ٿئي ٿو، ذيلي ڪلاس صحيح ڪم نه ڪندو.

2. ساخت

توھان وراثت جي بدران مرکب استعمال ڪري سگھو ٿا. اچو ته ان کي استعمال ڪندي هڪ حل ڏسو. فنڪشن attack()هڪ انٽرفيس جي طور تي خلاصو آهي.
interface Attack {
	public void move();
	public void 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(انگريزي بي مان)، ڪيئن هڪ قسم 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();
	}
}
ڪلاس ڊراگرام: جاوا ۾ وراثت بمقابله ساخت - 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. جيڪڏهن تعلق آهي "HAS"، پوء ترتيب کي ترجيح ڏني وئي آهي.
اهڙيء طرح، وراثت ۽ ٺهڪندڙ پنهنجون ايپليڪيشنون آهن ۽ انهن جي صلاحيتن کي سمجهڻ جي قابل آهي. لنڪس:
  1. بلوچ، جوشوا. مؤثر جاوا. پيئرسن ايجوڪيشن انڊيا، 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