JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ گھڻن وراثت. ساخت بمقابله وراثت
DSergey_Kh
سطح

جاوا ۾ گھڻن وراثت. ساخت بمقابله وراثت

گروپ ۾ شايع ٿيل

جاوا ۾ گھڻن وراثت

گهڻن ورثي توهان کي هڪ ڪلاس ٺاهڻ جي اجازت ڏئي ٿي جيڪا ڪيترن ئي سپر ڪلاسز مان ورثي ۾ ملي ٿي. برعڪس ڪجهه ٻين مشهور اعتراض تي مبني پروگرامنگ ٻولين، جهڙوڪ C++، جاوا ڪيترن ئي ورثي جي اجازت نه ڏيندو آهي طبقن مان. جاوا ڪيترن ئي طبقن جي ورثي کي سپورٽ نٿو ڪري ڇاڪاڻ ته اهو هيرن جي مسئلي کي جنم ڏئي سگهي ٿو. ۽ انهي مسئلي کي حل ڪرڻ جا طريقا ڳولڻ جي بدران، اتي بهتر اختيار آهن ته اسان ڪيئن ساڳيو نتيجو حاصل ڪري سگهون ٿا جهڙوڪ هڪ کان وڌيڪ وراثت.

هيرن جو مسئلو

هيرن جي مسئلي کي وڌيڪ آساني سان سمجھڻ لاءِ، اچو ته فرض ڪريون ته جاوا ۾ گھڻن ورثي جي مدد ڪئي وئي آھي. انهي صورت ۾، اسان کي هيٺ ڏنل تصوير ۾ ڏيکاريل آهي جيئن ته هڪ طبقي جو درجو رکي سگهي ٿو. جاوا ۾ گھڻن وراثت.  ساخت بمقابله وراثت - 1اچو ته فرض ڪريون ته ڪلاس SuperClassخلاصو آهي ۽ ان ۾ ڪو طريقو بيان ڪيو ويو آهي. ٻئي ڪنڪريٽ طبقن ClassA۽ ClassB.
package com.journaldev.inheritance;
public abstract class SuperClass {
	public abstract void doSomething();
}
package com.journaldev.inheritance;
public class ClassA extends SuperClass{
	@Override
	public void doSomething(){
		System.out.println("doSomething implementation of A");
	}
	//ClassA own method
	public void methodA(){
	}
}
package com.journaldev.inheritance;
public class ClassB extends SuperClass{
	@Override
	public void doSomething(){
		System.out.println("doSomething implementation of B");
	}
	//ClassB specific method
	public void methodB(){
	}
}
ھاڻي فرض ڪريو اسان ان کي لاڳو ڪرڻ چاھيو ٿا ClassC۽ ان کي ورثي ۾ حاصل ڪرڻ چاھيو ٿا ClassA۽ ClassB.
package com.journaldev.inheritance;
public class ClassC extends ClassA, ClassB{
	public void test(){
		//calling super class method
		doSomething();
	}
}
نوٽ ڪريو ته طريقو test()سڏي ٿو سپر ڪلاس طريقو doSomething(). اهو ابهام ڏانهن وٺي وڃي ٿو ڇاڪاڻ ته مرتب ڪندڙ کي خبر ناهي ته ڪهڙي سپر ڪلاس طريقي سان عمل ڪيو وڃي. هي هڪ هيرن جي شڪل وارو طبقو ڊراگرام آهي جنهن کي هيرن جو مسئلو سڏيو ويندو آهي. اهو بنيادي سبب آهي ته جاوا ڪيترن ئي ورثي کي سپورٽ نٿو ڪري. نوٽ ڪريو ته مٿيون مسئلو ڪيترن ئي طبقن جي ورثي سان صرف ٽن طبقن سان ٿي سگهي ٿو جن وٽ گهٽ ۾ گهٽ هڪ عام طريقو آهي.

گھڻن انٽرفيس وراثت

جاوا ۾، گھڻن وراثت طبقن ۾ سپورٽ نه آھي، پر اھو انٽرفيس ۾ سپورٽ آھي. ۽ ھڪڙو انٽرفيس ڪيترن ئي ٻين انٽرفيس کي وڌائي سگھي ٿو. هيٺ هڪ سادي مثال آهي.
package com.journaldev.inheritance;
public interface InterfaceA {
	public void doSomething();
}
package com.journaldev.inheritance;
public interface InterfaceB {
	public void doSomething();
}
نوٽ ڪريو ته ٻئي انٽرفيس ساڳئي طريقي جو اعلان ڪن ٿا. هاڻي اسان هڪ انٽرفيس ٺاهي سگهون ٿا جيڪو انهن ٻنهي انٽرفيس کي وڌائي، جيئن هيٺ ڏنل مثال ۾ ڏيکاريل آهي.
package com.journaldev.inheritance;
public interface InterfaceC extends InterfaceA, InterfaceB {
	//same method is declared in InterfaceA and InterfaceB both
	public void doSomething();
}
اهو تمام سٺو ڪم ڪري ٿو ڇاڪاڻ ته انٽرفيس صرف طريقن جو اعلان ڪن ٿا ۽ عمل درآمد انهن ڪلاسن ۾ ڪيو ويندو جيڪي انٽرفيس کي ورثي ۾ ڏين ٿا. ان ڪري، گھڻن انٽرفيس وراثت ۾ مونجهارو حاصل ڪرڻ جو ڪو طريقو ناهي.
package com.journaldev.inheritance;
public class InterfacesImpl implements InterfaceA, InterfaceB, InterfaceC {
	@Override
	public void doSomething() {
		System.out.println("doSomething implementation of concrete class");
	}
	public static void main(String[] args) {
		InterfaceA objA = new InterfacesImpl();
		InterfaceB objB = new InterfacesImpl();
		InterfaceC objC = new InterfacesImpl();

		//all the method calls below are going to same concrete implementation
		objA.doSomething();
		objB.doSomething();
		objC.doSomething();
	}
}
مهرباني ڪري نوٽ ڪريو ته جڏهن توهان ڪنهن به سپر ڪلاس جي طريقي کي اوور رائيڊ ڪيو يا انٽرفيس جو طريقو لاڳو ڪيو، تشريح استعمال ڪريو @Override. methodA()ڇا جيڪڏهن اسان ڪلاس جي فنڪشن ۽ ڪلاس ۾ ڪلاس جو ClassAفنڪشن استعمال ڪرڻ چاهيون ٿا ؟ حل انشا جي استعمال ۾ آهي. هيٺ ڏنل ڪلاس جو هڪ نسخو آهي جيڪو استعمال ڪري ٿو ڪلاس جي طريقن ۽ طريقن مان هڪ کي بيان ڪرڻ لاءِ. methodB()ClassBClassCClassCdoSomething()
package com.journaldev.inheritance;
public class ClassC{
	ClassA objA = new ClassA();
	ClassB objB = new ClassB();
	public void test(){
		objA.doSomething();
	}
	public void methodA(){
		objA.methodA();
	}
	public void methodB(){
		objB.methodB();
	}
}

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

جاوا پروگرامنگ جي بهترين طريقن مان هڪ آهي ”وراثت کان اڳ ٺاهه جي منظوري“. اسان ڪجھھ پهلوئن کي ڳوليندا سين جيڪي ھن طريقي جي حق ۾ آھن.
  1. اچو ته چوندا آهيون اسان وٽ هڪ سپر ڪلاس ۽ هڪ ڪلاس آهي جيڪو ان کي وڌائي ٿو:

    package com.journaldev.inheritance;
    public class ClassC{
    	public void methodC(){
    	}
    }
    package com.journaldev.inheritance;
    public class ClassD extends ClassC{
    	public int test(){
    		return 0;
    	}
    }

    مٿي ڏنل ڪوڊ گڏ ڪري ٿو ۽ سٺو ڪم ڪري ٿو. پر، ڇا جيڪڏھن اسان ڪلاس جي عمل کي تبديل ڪريون ClassCجيئن ھيٺ ڏيکاريل آھي:

    package com.journaldev.inheritance;
    public class ClassC{
    	public void methodC(){
    	}
    	public void test(){
    	}
    }

    نوٽ ڪريو ته طريقو test()اڳ ۾ ئي ذيلي ڪلاس ۾ موجود آهي، پر واپسي جو قسم مختلف آهي. ھاڻي ڪلاس ClassDمرتب نه ٿيندو ۽ جيڪڏھن توھان ڪو IDE استعمال ڪريو ٿا، اھو توھان کي واپسي جي قسم کي سپر ڪلاس يا سب ڪلاس ۾ تبديل ڪرڻ لاءِ اشارو ڪندو.

    ھاڻي ھڪڙي صورتحال جو تصور ڪريو جتي اسان وٽ ھڪ گھڻ-سطح ڪلاس واري ورثي واري درجي بندي آھي ۽ اسان وٽ سپر ڪلاس تائين رسائي نه آھي. اسان وٽ ڪو به اختيار نه هوندو پر اسان جي ذيلي طبقي جي طريقي جي دستخط يا ان جو نالو تبديل ڪرڻ لاءِ تاليف جي غلطي کي ختم ڪرڻ لاءِ. اسان کي انهن سڀني هنڌن تي ذيلي طبقي جو طريقو به تبديل ڪرڻو پوندو جتي اهو سڏيو ويندو آهي. ان ڪري، وراثت اسان جي ڪوڊ کي خراب ڪري ٿو.

    مٿيون مسئلو ٺهڻ سان ڪڏهن به نه ٿيندو ۽ اهو ان کي وراثت ۾ وڌيڪ پرڪشش بڻائي ٿو.

  2. وراثت سان گڏ هڪ ٻيو مسئلو اهو آهي ته اسان سپر ڪلاس جي سڀني طريقن کي ڪلائنٽ جي سامهون پيش ڪندا آهيون ۽ جيڪڏهن اسان جي سپر ڪلاس کي صحيح طرح سان ڊزائين نه ڪيو ويو آهي ۽ حفاظتي سوراخ موجود آهن ته پوء اسان جي ڪلاس جي بهترين عمل تي عمل ڪرڻ جي باوجود، اسان خراب عمل جي ڪري متاثر ٿيندا آهيون. سپر ڪلاس جو. ڪمپوزيشن اسان کي سپر ڪلاس طريقن تائين ڪنٽرول ٿيل رسائي فراهم ڪرڻ ۾ مدد ڪري ٿي، جڏهن ته وراثت سپر ڪلاس طريقن تي ڪنٽرول مهيا نٿو ڪري. هي پڻ وراثت مان ٺهيل جي مکيه فائدن مان هڪ آهي.

  3. مرکب جو ٻيو فائدو اهو آهي ته اهو ڪالنگ طريقن ۾ لچڪ جي اجازت ڏئي ٿو. مٿي پيش ڪيل ڪلاس تي اسان جو عمل ClassCبهتر نه آهي ۽ يقيني بڻائي ٿو ته مرتب وقت ان طريقي سان ڳنڍيل آهي جنهن کي سڏيو ويندو. گھٽ ۾ گھٽ تبديلين سان اسان ڪري سگھون ٿا طريقو ڪال لچڪدار ۽ متحرڪ.

    package com.journaldev.inheritance;
    public class ClassC{
    	SuperClass obj = null;
    	public ClassC(SuperClass o){
    		this.obj = o;
    	}
    	public void test(){
    		obj.doSomething();
    	}
    	public static void main(String args[]){
    		ClassC obj1 = new ClassC(new ClassA());
    		ClassC obj2 = new ClassC(new ClassB());
    
    		obj1.test();
    		obj2.test();
    	}
    }

    مٿي پيش ڪيل پروگرام جو نتيجو:

    doSomething implementation of A
    doSomething implementation of B

    طريقو ڪالنگ ۾ هي لچڪدار وراثت سان دستياب ناهي، جيڪو مرکب جي چونڊ ۾ هڪ ٻيو فائدو شامل ڪري ٿو.

  4. يونٽ جي جاچ ڪرڻ آسان آهي ساخت سان، ڇاڪاڻ ته اسان ڄاڻون ٿا ته اسين سڀ طريقا استعمال ڪري رهيا آهيون سپر ڪلاس مان ۽ انهن کي ڪاپي ڪري سگھون ٿا ٽيسٽ لاءِ. جڏهن ته وراثت ۾ اسان سپر ڪلاس تي وڌيڪ انحصار ڪندا آهيون ۽ سپر ڪلاس جا اهي سڀئي طريقا نٿا ڄاڻون جيڪي استعمال ڪيا ويندا. تنهنڪري اسان کي سپر ڪلاس جي سڀني طريقن کي جانچڻو پوندو، جيڪو وراثت جي ڪري اضافي ڪم آهي.

    مثالي طور، اسان کي صرف وراثت استعمال ڪرڻ گهرجي جڏهن ذيلي ڪلاس کان سپر ڪلاس رشتي جي وضاحت ڪئي وئي آهي "آهي". ٻين سڀني حالتن ۾، ان جي جوڙجڪ کي استعمال ڪرڻ جي صلاح ڏني آهي.

تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION