JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ گھڻن وراثت. ساخت ۽ وراثت جو مقابلو
HonyaSaar
سطح
Москва

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

گروپ ۾ شايع ٿيل
ڪجهه وقت اڳ مون جاوا ۾ ورثي، انٽرفيس ۽ ڪمپوزيشن بابت ڪيتريون ئي تحريرون لکيون. هن آرٽيڪل ۾، اسان هڪ کان وڌيڪ وراثت تي نظر ڪنداسين ۽ پوء وراثت تي ساخت جي فائدن بابت ڄاڻون ٿا.
جاوا ۾ گھڻن وراثت.  ساخت ۽ وراثت جو مقابلو - 1

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

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

"هيرن جو مسئلو"

هيرن جي مسئلي کي وڌيڪ آسان سمجهڻ لاء، اچو ته فرض ڪريون ته جاوا ۾ گهڻن ورثي جي حمايت ڪئي وئي آهي. انهي حالت ۾، اسان هيٺ ڏنل شڪل ۾ ڏيکاريل درجه بندي سان ڪلاس حاصل ڪري سگهون ٿا. هيرن جي درجي جو درجواچو ته فرض ڪريون ته اھو SuperClassھڪڙو خلاصو طبقو آھي جيڪو ھڪڙي خاص طريقي کي بيان ڪري ٿو، ۽ طبقن ClassA۽ ClassBحقيقي ڪلاس آھن. SuperClass.java
package com.journaldev.inheritance;
public abstract class SuperClass {
   	public abstract void doSomething();
}
ClassA.java
package com.journaldev.inheritance;
public class ClassA extends SuperClass{
    @Override
 public void doSomething(){
        System.out.println("Какая-то реализация класса A");
    }
  //собственный метод класса  ClassA
    public void methodA(){
    }
}
هاڻي، اچو ته فرض ڪريو ته ڪلاس هڪ ئي وقت کان ClassCورثي ۾ ملي ٿو ، ۽ ساڳئي وقت هيٺ ڏنل عمل آهي: ClassA ClassB
package com.journaldev.inheritance;
public class ClassC extends ClassA, ClassB{
    public void test(){
        //вызов метода родительского класса
        doSomething();
    }
}
نوٽ ڪريو ته ميٿڊ پيرن ڪلاس جو test()ميٿڊ سڏجي ٿو doSomething()، جيڪو ابهام جو سبب بڻجندو ڇو ته مرتب ڪندڙ کي خبر ناهي ته ڪهڙي سپر ڪلاس ميٿڊ کي سڏڻ گهرجي. هن صورتحال ۾ طبقاتي وراثت واري شڪل جي شڪل جي ڪري، جيڪو هڪ طرفي هيرن جي خاڪو وانگر آهي، ان مسئلي کي "هيرن جو مسئلو" سڏيو ويندو آهي. اهو بنيادي سبب آهي ته جاوا ڪيترن ئي طبقي ورثي کي سپورٽ نٿو ڪري. نوٽ ڪريو ته هي مسئلو ڪيترن ئي طبقن جي ورثي سان پڻ ٿي سگهي ٿو ٽن طبقن سان جيڪي گهٽ ۾ گهٽ هڪ عام طريقو آهي.

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

توهان شايد محسوس ڪيو آهي ته مان هميشه چوان ٿو "گهڻن ورثي طبقن جي وچ ۾ سهڪار نه آهي"، پر اهو انٽرفيس جي وچ ۾ سپورٽ آهي. هڪ سادي مثال هيٺ ڏيکاريل آهي: InterfaceA.java
package com.journaldev.inheritance;
public interface InterfaceA {

    public void doSomething();
}
InterfaceB.java
package com.journaldev.inheritance;

public interface InterfaceB {

    public void doSomething();
}
نوٽ ڪريو ته ٻنهي انٽرفيس جو طريقو ساڳيو نالو آهي. هاڻي اچو ته اسان وٽ هڪ انٽرفيس آهي جيڪو ٻنهي انٽرفيس مان ورثي ۾ ملي ٿو. InterfaceC.java
package com.journaldev.inheritance;

public interface InterfaceC extends InterfaceA, InterfaceB {

    //метод, с тем же названием описан в  InterfaceA и InterfaceB
    public void doSomething();
هتي، سڀ ڪجهه مثالي آهي، ڇو ته انٽرفيس صرف هڪ طريقي جي وضاحت/تفصيل آهي، ۽ طريقي جو عمل خود ان ڪنڪريٽ طبقي ۾ هوندو جيڪو انهن انٽرفيس کي لاڳو ڪري ٿو، تنهنڪري انٽرفيس جي ڪيترن ئي ورثي سان ابهام کي منهن ڏيڻ جو ڪو به امڪان ناهي. اهو ئي سبب آهي ته جاوا ۾ ڪلاس ڪيترن ئي انٽرفيس مان ورثي ۾ ملي سگهن ٿا. اچو ته ان کي هيٺ ڏنل مثال سان ڏيکاريون. InterfacesImpl.java
package com.journaldev.inheritance;

public class InterfacesImpl implements InterfaceA, InterfaceB, InterfaceC {

    @Override
    public void doSomething() {
        System.out.println("doSomething реализация реального класса ");
    }

    public static void main(String[] args) {
        InterfaceA objA = new InterfacesImpl();
        InterfaceB objB = new InterfacesImpl();
        InterfaceC objC = new InterfacesImpl();

        //все вызываемые ниже методы получат одинаковую реализацию конкретного класса

        objA.doSomething();
        objB.doSomething();
        objC.doSomething();
    }
}
توهان شايد محسوس ڪيو هوندو ته هر ڀيري آئون سپر ڪلاس يا انٽرفيس ۾ بيان ڪيل طريقي کي اوور رائيڊ ڪريان ٿو، آئون @Override تشريح استعمال ڪريان ٿو. هي هڪ آهي ٽن ٺهيل جاوا تشريحن مان ۽ توهان کي هميشه ان کي استعمال ڪرڻ گهرجي جڏهن طريقن کي ختم ڪرڻ.

تخليق جي طور تي نجات

پوء ڇا جيڪڏهن اسان هڪ methodA()طبقي ClassA۽ methodB()طبقي فنڪشن ClassBکي استعمال ڪرڻ چاهيون ٿا ClassС؟ ان جو حل ٿي سگھي ٿو composition - ھڪ وري لکيل ورزن ClassCجيڪو ٻنھي طبقي جي طريقن کي لاڳو ڪري ٿو ClassA۽ ان ۾ ھڪڙي شئي لاءِ ClassBعمل درآمد پڻ آھي . doSomething() ClassC.java
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. فرض ڪريو اسان وٽ والدين-وارث طبقن جو هيٺين ميلاپ آهي:

    ClassC.java

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

    ClassD.java

    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 استعمال ڪري رهيا آهيو، اهو مرتب نه ٿيندو. توهان کي صلاح ڏني ويندي ته واپسي جي قسم کي اولاد يا سپر ڪلاس ۾ تبديل ڪريو.

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

    مٿي بيان ڪيل مسئلو ڪڏهن به ٺهڻ ​​جي صورت ۾ نه ٿو اچي، ان ڪري ورثي کي ترجيح ڏئي ٿو.

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

    ڪمپوزيشن اسان کي سپر ڪلاس جي طريقن تائين ڪنٽرول رسائي فراهم ڪرڻ ۾ مدد ڪري ٿي، جڏهن ته وراثت ان جي طريقن تي ڪو به ڪنٽرول برقرار نٿو رکي. هي پڻ وراثت مٿان ساخت جي مکيه فائدن مان هڪ آهي.

  3. ساخت جو هڪ ٻيو فائدو اهو آهي ته اهو لچڪ وڌائيندو آهي جڏهن طريقن کي سڏيندو آهي. مٿي بيان ڪيل ڪلاس جو نفاذ ClassCبهتر نه آهي ۽ استعمال ڪري ٿو ابتدائي بائنڊنگ سڏيو وڃي ٿو طريقي سان. گھٽ ۾ گھٽ تبديليون اسان کي طريقي سان ڪالنگ کي لچڪدار بڻائڻ جي اجازت ڏين ٿيون ۽ دير سان پابند ڪرڻ جي اجازت ڏين ٿيون (رن ٽائم تي پابند).

    ClassC.java

    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