JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ پوليمورفيزم

جاوا ۾ پوليمورفيزم

گروپ ۾ شايع ٿيل
OOP بابت سوال هڪ ٽيڪنيڪل انٽرويو جو هڪ لازمي حصو آهن هڪ IT ڪمپني ۾ جاوا ڊولپر جي پوزيشن لاءِ. هن آرٽيڪل ۾ اسان OOP جي اصولن مان هڪ بابت ڳالهائينداسين - پوليمورفيزم. اسان انهن پهلوئن تي ڌيان ڏينداسين جيڪي اڪثر انٽرويو دوران پڇيا ويندا آهن، ۽ وضاحت لاءِ ننڍڙا مثال پڻ فراهم ڪندا.

پوليمورفيزم ڇا آهي؟

پوليمورفيزم هڪ پروگرام جي صلاحيت آهي هڪ ئي انٽرفيس سان شين کي هڪجهڙائي سان استعمال ڪرڻ جي بغير هن اعتراض جي مخصوص قسم بابت ڄاڻ. جيڪڏهن توهان سوال جو جواب ڏيو ته هن طريقي سان پوليمورفيزم ڇا آهي، توهان کان گهڻو ڪري پڇيو ويندو ته توهان جي معني ڇا آهي. هڪ دفعو ٻيهر، بغير ڪنهن اضافي سوالن جي پڇڻ کان سواء، انٽرويو وٺندڙ لاء هر شيء کي ترتيب ڏيو.

جاوا ۾ پوليمورفيزم هڪ انٽرويو ۾ - 1
اسان ان حقيقت سان شروع ڪري سگھون ٿا ته او او پي جي نقطه نظر ۾ جاوا پروگرام جي تعمير شامل آهي شين جي رابطي جي بنياد تي جيڪي طبقن تي ٻڌل آهن. ڪلاس اڳ ۾ لکيل ڊرائنگ (ٽيمپليٽس) آهن جن جي مطابق پروگرام ۾ شيون ٺاهي وينديون آهن. ان کان علاوه، هڪ طبقي هميشه هڪ مخصوص قسم آهي، جيڪو، هڪ سٺي پروگرامنگ انداز سان، ان جو مقصد ان جي نالي سان "ٻڌائي ٿو". وڌيڪ، اهو نوٽ ڪري سگهجي ٿو ته جيئن ته جاوا هڪ مضبوط ٽائيپ ٿيل ٻولي آهي، پروگرام ڪوڊ هميشه هر شيء جي قسم کي ظاهر ڪرڻ جي ضرورت آهي جڏهن متغير جو اعلان ڪيو وڃي. انهي ۾ شامل ڪريو ته سخت ٽائپنگ ڪوڊ جي حفاظت ۽ پروگرام جي اعتبار کي وڌائي ٿي ۽ توهان کي ترتيب ڏيڻ واري مرحلي تي قسم جي غير مطابقت واري غلطين (مثال طور، هڪ نمبر ذريعي اسٽرنگ کي ورهائڻ جي ڪوشش) کي روڪڻ جي اجازت ڏئي ٿي. قدرتي طور تي، مرتب ڪندڙ کي اعلان ڪيل قسم کي "ڄاڻڻ" گهرجي - اهو JDK مان هڪ ڪلاس ٿي سگهي ٿو يا جيڪو اسان پاڻ ٺاهيو آهي. مھرباني ڪري انٽرويو وٺندڙ کي نوٽ ڪريو ته جڏھن پروگرام ڪوڊ سان ڪم ڪري رھيا آھيون، اسان نه رڳو استعمال ڪري سگھون ٿا ان قسم جون شيون جيڪي بيان ڪرڻ وقت اسان تفويض ڪيون آھن، پر ان جو اولاد پڻ. هي هڪ اهم نقطو آهي: اسان ڪيترن ئي قسمن کي علاج ڪري سگهون ٿا ڄڻ ته اهي صرف هڪ هئا (جيستائين اهي قسمون بنيادي قسم مان نڪتل آهن). هن جو مطلب اهو پڻ آهي ته، هڪ سپر ڪلاس قسم جي هڪ متغير کي قرار ڏيڻ کان پوء، اسان ان کي ان جي اولاد مان هڪ جي قيمت مقرر ڪري سگهون ٿا. انٽرويو وٺندڙ ان کي پسند ڪندو جيڪڏهن توهان هڪ مثال ڏيو. ڪجھ اعتراض چونڊيو جيڪي شيون جي ھڪڙي گروپ لاءِ عام (بنيادي) ٿي سگھن ٿيون ۽ ان مان ڪجھ طبقن کي ورثي ۾ آڻين. بنيادي ڪلاس:
public class Dancer {
    private String name;
    private int age;

    public Dancer(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void dance() {
        System.out.println(toString() + "I dance like everyone else.");
    }

    @Override
    public String toString() {
        return "Я " + name + ", to me " + age + " years. " ;
    }
}
اولاد ۾، بنيادي طبقي جي طريقي کي ختم ڪريو:
public class ElectricBoogieDancer extends Dancer {
    public ElectricBoogieDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance() {
        System.out.println( toString() + "I dance electric boogie!");
    }
}

public class BreakDankDancer extends Dancer{

    public BreakDankDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance(){
        System.out.println(toString() + "I'm breakdancing!");
    }
}
جاوا ۾ پوليمورفيزم جو هڪ مثال ۽ هڪ پروگرام ۾ شين جو استعمال:
public class Main {

    public static void main(String[] args) {
        Dancer dancer = new Dancer("Anton", 18);

        Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);// upcast to base type
        Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20); // upcast to base type

        List<Dancer> discotheque = Arrays.asList(dancer, breakDanceDancer, electricBoogieDancer);
        for (Dancer d : discotheque) {
            d.dance();// polymorphic method call
        }
    }
}
mainڏيکاريو طريقي جي ڪوڊ ۾ ڇا آهي لائنن ۾:
Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);
Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20);
اسان هڪ سپر ڪلاس قسم جي متغير جو اعلان ڪيو ۽ ان کي اولاد مان هڪ جي قيمت مقرر ڪيو. گهڻو ڪري، توهان کان پڇيو ويندو ڇو ته مرتب ڪندڙ اسائنمينٽ جي نشاني جي کاٻي ۽ ساڄي طرف بيان ڪيل قسمن جي وچ ۾ بي ميلاپ جي شڪايت ڇو نه ڪندو، ڇو ته جاوا سخت ٽائپنگ آهي. وضاحت ڪريو ته مٿي واري قسم جي تبديلي هتي ڪم ڪري ٿي - هڪ اعتراض جي حوالي سان تشريح ڪئي وئي آهي بنيادي طبقي جي حوالي سان. ان کان علاوه، مرتب ڪندڙ، ڪوڊ ۾ اهڙي تعمير جو سامنا ڪيو، اهو خودڪار ۽ واضح طور تي ڪري ٿو. مثال جي ڪوڊ جي بنياد تي، اهو ڏيکاري سگهجي ٿو ته ڪلاس جي قسم جو اعلان ڪيل تفويض جي نشاني جي کاٻي طرف Dancerڪيترن ئي فارمن (قسم) کي ساڄي طرف اعلان ڪيو ويو آهي BreakDankDancer، ElectricBoogieDancer. هر هڪ فارم کي عام ڪارڪردگيءَ لاءِ پنهنجو منفرد رويو ٿي سگهي ٿو جيڪو سپر ڪلاس ميٿڊ ۾ بيان ڪيو ويو آهي dance. اهو آهي، هڪ سپر ڪلاس ۾ اعلان ڪيل هڪ طريقو ان جي اولاد ۾ مختلف طريقي سان لاڳو ڪري سگهجي ٿو. انهي صورت ۾، اسان طريقي سان ڪم ڪري رهيا آهيون اوور رائيڊنگ، ۽ اهو ئي آهي جيڪو مختلف قسم جي شڪل ٺاهي ٿو (رويي). توھان ھي ڏسي سگھو ٿا مکيه طريقو ڪوڊ ھلائيندي عمل ڪرڻ لاءِ: پروگرام آئوٽ پُٽ مان انتون آھيان، آءٌ 18 سالن جو آھيان. مان ٻين وانگر نچندو آهيان. مان Alexey آهيان، مان 19 سالن جو آهيان. مان بريڪ ڊانس! مان Igor آهيان، مان 20 سالن جو آهيان. مان ڊانس ڪريان ٿو برقي بوگي! جيڪڏهن اسان اولاد ۾ اوور رائڊنگ استعمال نه ڪنداسين ته پوءِ اسان کي مختلف رويو نه ملندو. BreakDankDancerمثال طور، جيڪڏهن اسان پنهنجي ڪلاسن لاءِ ElectricBoogieDancerطريقي تي تبصرو ڪريون ٿا dance، پروگرام جو نتيجو هن طرح هوندو: مان Anton آهيان، مان 18 سالن جو آهيان. مان ٻين وانگر نچندو آهيان. مان Alexey آهيان، مان 19 سالن جو آهيان. مان ٻين وانگر نچندو آهيان. مان Igor آهيان، مان 20 سالن جو آهيان. مان ٻين وانگر نچندو آهيان. BreakDankDancer۽ ان جو مطلب اهو آهي ته نوان ڪلاس ٺاهڻ جو ڪو به مقصد ناهي ElectricBoogieDancer. ڇا، حقيقت ۾، جاوا پوليمورفيزم جو اصول آهي؟ ڪنهن پروگرام ۾ ڪنهن شئي کي ان جي مخصوص قسم جي ڄاڻ کان سواءِ استعمال ڪرڻ ڪٿي لڪيل آهي؟ اسان جي مثال ۾، هي هڪ طريقو آهي ڪال قسم جي d.dance()اعتراض تي . جاوا پوليمورفيزم جو مطلب آهي ته پروگرام کي ڄاڻڻ جي ضرورت ناهي ته ڪهڙي قسم جو اعتراض يا اعتراض هوندو . بنيادي شيء اها آهي ته اهو هڪ طبقي جو اولاد آهي . ۽ جيڪڏهن اسان اولاد جي باري ۾ ڳالهايون ٿا، اهو ياد رکڻ گهرجي ته جاوا ۾ وراثت نه رڳو آهي ، پر پڻ . هاڻي اهو ياد رکڻ جو وقت آهي ته جاوا ڪيترن ئي ورثي جي حمايت نٿو ڪري - هر قسم ۾ هڪ والدين (سپر ڪلاس) ۽ اولاد جي لامحدود تعداد (ذيلي طبقن) ٿي سگهي ٿي. تنهن ڪري، انٽرفيس استعمال ڪيا ويندا آهن ڪيترن ئي ڪارڪردگي کي ڪلاس ۾ شامل ڪرڻ لاء. انٽرفيس وراثت جي مقابلي ۾ والدين کي شين جي ملائڻ کي گھٽائي ٿو ۽ تمام وڏي پيماني تي استعمال ڪيا ويا آهن. جاوا ۾، هڪ انٽرفيس هڪ ريفرنس جو قسم آهي، تنهنڪري هڪ پروگرام ان قسم کي انٽرفيس جي قسم جو متغير هجڻ جو اعلان ڪري سگهي ٿو. اهو سٺو وقت آهي مثال ڏيڻ لاءِ. اچو ته انٽرفيس ٺاهي: dDancerBreakDankDancerElectricBoogieDancerDancerextendsimplements
public interface Swim {
    void swim();
}
وضاحت لاء، اچو ته مختلف ۽ غير لاڳاپيل شيون وٺون ۽ انهن ۾ هڪ انٽرفيس لاڳو ڪريو:
public class Human implements Swim {
    private String name;
    private int age;

    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public void swim() {
        System.out.println(toString()+"I swim with an inflatable ring.");
    }

    @Override
    public String toString() {
        return "Я " + name + ", to me " + age + " years. ";
    }

}

public class Fish implements Swim{
    private String name;

    public Fish(String name) {
        this.name = name;
    }

    @Override
    public void swim() {
        System.out.println("I'm a fish " + name + ". I swim by moving my fins.");

    }

public class UBoat implements Swim {

    private int speed;

    public UBoat(int speed) {
        this.speed = speed;
    }

    @Override
    public void swim() {
        System.out.println("The submarine is sailing, rotating the propellers, at a speed" + speed + " knots.");
    }
}
طريقو main:
public class Main {

    public static void main(String[] args) {
        Swim human = new Human("Anton", 6);
        Swim fish = new Fish("whale");
        Swim boat = new UBoat(25);

        List<Swim> swimmers = Arrays.asList(human, fish, boat);
        for (Swim s : swimmers) {
            s.swim();
        }
    }
}
انٽرفيس ۾ بيان ڪيل پوليمورفڪ طريقي تي عمل ڪرڻ جو نتيجو اسان کي ان انٽرفيس کي لاڳو ڪندڙ قسمن جي رويي ۾ فرق ڏسڻ جي اجازت ڏئي ٿو. اهي طريقن جي عمل جي مختلف نتيجن تي مشتمل آهن swim. اسان جي مثال جي مطالعي کان پوء، انٽرويو وٺندڙ پڇي سگھي ٿو ڇو، جڏهن ڪوڊ تي عمل ڪنديmain
for (Swim s : swimmers) {
            s.swim();
}
ڇا انهن طبقن ۾ بيان ڪيل طريقن کي اسان جي شين لاء سڏيو ويندو آهي؟ توهان ڪئين طريقي جي گهربل عمل کي چونڊيو ٿا جڏهن هڪ پروگرام تي عمل ڪيو وڃي؟ انهن سوالن جو جواب ڏيڻ لاء، اسان کي دير سان (متحرڪ) پابند بابت ڳالهائڻ جي ضرورت آهي. پابند ڪرڻ سان اسان جو مطلب آهي هڪ طريقو ڪال جي وچ ۾ ڪنيڪشن قائم ڪرڻ ۽ ڪلاس ۾ ان جي مخصوص عمل درآمد. لازمي طور تي، ڪوڊ اهو طئي ڪري ٿو ته ڪلاس ۾ بيان ڪيل ٽن طريقن مان ڪهڙو عمل ڪيو ويندو. جاوا ڊفالٽ طور تي دير سان بائنڊنگ استعمال ڪري ٿو (رن ٽائم تي بلڪ گڏ ڪرڻ واري وقت تي، جيئن ته ابتدائي بائنڊنگ جي صورت ۾). هن جو مطلب آهي ته جڏهن ڪوڊ گڏ ڪرڻ
for (Swim s : swimmers) {
            s.swim();
}
مرتب ڪندڙ کي اڃا تائين خبر ناهي ته ڪوڊ ڪهڙي ڪلاس مان آهي Human، Fishيا ڇا Uboatان تي عمل ڪيو ويندو swim. اهو صرف تڏهن طئي ڪيو ويندو جڏهن پروگرام تي عمل ڪيو ويندو متحرڪ ترسيل جي ميکانيزم جي مهرباني - پروگرام جي عمل دوران اعتراض جي قسم کي جانچڻ ۽ هن قسم جي طريقي جي گهربل عمل کي چونڊيو. جيڪڏهن توهان کان پڇيو وڃي ته اهو ڪيئن لاڳو ٿئي ٿو، توهان جواب ڏئي سگهو ٿا ته جڏهن شيون لوڊ ڪندي ۽ شروع ڪندي، JVM ميموري ۾ ٽيبل ٺاهي ٿو، ۽ انهن ۾ متغيرن کي انهن جي قدرن سان، ۽ شيون انهن جي طريقن سان ملائي ٿو. ان کان علاوه، جيڪڏهن ڪو اعتراض وراثت ۾ ملي ٿو يا هڪ انٽرفيس کي لاڳو ڪري ٿو، ان جي طبقي ۾ اوور رائڊ ٿيل طريقن جي موجودگي کي پهريون ڀيرو چڪاس ڪيو ويو آهي. جيڪڏهن ڪي به آهن، اهي هن قسم سان ڳنڍيا ويا آهن، جيڪڏهن نه، هڪ طريقو ڳولهيو ويو آهي جنهن جي وضاحت ڪئي وئي آهي ڪلاس ۾ هڪ سطح کان وڌيڪ (والدين ۾) ۽ انهي تي روٽ تائين هڪ گھڻ-سطح واري ترتيب ۾. او او پي ۾ پوليمورفيزم جي باري ۾ ڳالهائيندي ۽ پروگرام ڪوڊ ۾ ان جي عمل درآمد بابت، اسان ياد رکون ٿا ته اهو سٺو عمل آهي خلاصو وضاحتن کي استعمال ڪرڻ لاءِ بنيادي ڪلاسن کي بيان ڪرڻ لاءِ خلاصو ڪلاس ۽ انٽرفيس استعمال ڪندي. هي مشق تجريدي جي استعمال تي مبني آهي - عام رويي ۽ ملڪيتن کي الڳ ڪرڻ ۽ انهن کي خلاصي طبقي ۾ بند ڪرڻ، يا صرف عام رويي کي الڳ ڪرڻ - ان صورت ۾ اسان هڪ انٽرفيس ٺاهيندا آهيون. او او پي پوليمورفيزم جي اصول کي پورو ڪرڻ لاءِ انٽرفيس ۽ طبقاتي وراثت جي بنياد تي شين جي هڪ درجي بندي کي تعمير ۽ ڊزائين ڪرڻ هڪ لازمي شرط آهي. جاوا ۾ پوليمورفيزم ۽ جدت جي مسئلي جي حوالي سان، اسان اهو ذڪر ڪري سگهون ٿا ته جڏهن خلاصي طبقن ۽ انٽرفيس ٺاهڻ، جاوا 8 سان شروع ٿيندي، اهو ممڪن آهي ته بنيادي ڪلاسن ۾ خلاصي طريقن جي ڊفالٽ عمل کي لفظ استعمال ڪندي لکڻ default. مثال طور:
public interface Swim {
    default void swim() {
        System.out.println("Just floating");
    }
}
ڪڏهن ڪڏهن اهي بنيادي طبقن ۾ طريقن جي اعلان جي ضرورتن جي باري ۾ پڇي سگھن ٿا ته جيئن پوليمورفيزم جي اصول جي ڀڃڪڙي نه ٿئي. هتي سڀ ڪجهه سادو آهي: اهي طريقا جامد ، نجي ۽ حتمي نه هجڻ گهرجن . خانگي طريقي کي صرف ڪلاس ۾ دستياب بڻائي ٿو، ۽ توھان ان کي اولاد ۾ ختم نه ٿا ڪري سگھو. جامد طريقي کي طبقن جي ملڪيت بڻائي ٿو، اعتراض نه، تنهنڪري سپر ڪلاس طريقو هميشه سڏيو ويندو. حتمي طريقي کي ناقابل قبول ۽ ان جي وارثن کان لڪائي ڇڏيندو.

پوليمورفيزم اسان کي جاوا ۾ ڇا ڏئي ٿو؟

سوال اهو آهي ته پوليمورفيزم جو استعمال اسان کي ڏئي ٿو گهڻو ڪري پڻ پيدا ٿيندو. هتي توهان مختصر طور تي جواب ڏئي سگهو ٿا، بغير گھاس ۾ وڃڻ کان سواء:
  1. توهان کي اعتراض جي عملن کي تبديل ڪرڻ جي اجازت ڏئي ٿي. اهو آهي جيڪو ٽيسٽ تي ٻڌل آهي.
  2. پروگرام جي وسعت مهيا ڪري ٿي - اهو مستقبل لاءِ بنياد ٺاهڻ تمام آسان ٿي وڃي ٿو. موجوده قسمن جي بنياد تي نون قسمن کي شامل ڪرڻ تمام عام طريقو آھي پروگرامن جي ڪارڪردگي کي وڌائڻ جو OOP انداز ۾ لکيل آھي.
  3. توهان کي اجازت ڏئي ٿي ته شين کي هڪ عام قسم يا رويي سان گڏ هڪ مجموعي يا صف ۾ گڏ ڪريو ۽ انهن کي هڪجهڙائي سان منظم ڪريو (جيئن اسان جي مثالن ۾، هر ڪنهن کي ناچ ڪرڻ - هڪ طريقو danceيا ترڻ - هڪ طريقو swim).
  4. لچڪدار جڏهن نوان قسم ٺاهي رهيا آهيو: توهان چونڊ ڪري سگهو ٿا هڪ طريقو لاڳو ڪرڻ لاء والدين کان يا ان کي ٻار ۾ ختم ڪرڻ.

سفر لاءِ جدا جدا لفظ

پوليمورفيزم جو اصول هڪ تمام اهم ۽ وسيع موضوع آهي. اهو تقريباً جاوا جي OOP جو اڌ ۽ ٻولي جي بنيادي ڳالهين جو هڪ سٺو حصو پکڙيل آهي. توهان هڪ انٽرويو ۾ هن اصول کي بيان ڪرڻ کان پري نه ٿي سگهندا. ان جي لاعلمي يا غلط فهمي گهڻو ڪري انٽرويو کي ختم ڪري ڇڏيندو. تنهن ڪري، امتحان کان پهريان پنهنجي علم کي جانچڻ ۾ سست نه ٿيو ۽ ضروري هجي ته ان کي تازو ڪريو.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION