CodeGym /جاوا بلاگ /Random-SD /جاوا پوليمورفيزم
John Squirrels
سطح
San Francisco

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

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

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

پوليمورفيزم (Polymorphism) ھڪ پروگرام جي صلاحيت آھي جنھن کي ھڪڙي ئي انٽرفيس سان ھڪڙي طريقي سان علاج ڪرڻ جي قابل آھي، بغير ڪنھن شئي جي مخصوص قسم جي ڄاڻ جي. جيڪڏهن توهان هڪ سوال جو جواب ڏيو ته پوليمورفيزم ڇا آهي، توهان کي گهڻو ڪري پڇيو ويندو ته توهان جو مطلب ڇا آهي. بغير اضافي سوالن جو هڪ گروپ شروع ڪرڻ کان سواء، انٽرويو وٺندڙ لاء اهو سڀ ڪجهه هڪ ڀيرو ٻيهر رکو. انٽرويو جو وقت: جاوا ۾ پوليمورفيزم - 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 "I'm " + name + ". I'm " + age + " years old.";
    }
}
ذيلي ڪلاسن ۾، بنيادي طبقي جي طريقي کي ختم ڪريو:
public class ElectricBoogieDancer extends Dancer {
    public ElectricBoogieDancer(String name, int age) {
        super(name, age);
    }
// Override the method of the base class
    @Override
    public void dance() {
        System.out.println(toString () + " I dance the electric boogie!");
    }
}

public class Breakdancer extends Dancer {

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

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

        Dancer breakdancer = new Breakdancer("Jay", 19); // Widening conversion to the base type
        Dancer electricBoogieDancer = new ElectricBoogieDancer("Marcia", 20); // Widening conversion to the base type

        List<dancer> disco = Arrays.asList(dancer, breakdancer, electricBoogieDancer);
        for (Dancer d : disco) {
            d.dance(); // Call the polymorphic method
        }
    }
}
مکيه طريقي ۾ ، ڏيکاريو ته لائينون
Dancer breakdancer = new Breakdancer("Jay", 19);
Dancer electricBoogieDancer = new ElectricBoogieDancer("Marcia", 20);
هڪ سپر ڪلاس جي هڪ متغير جو اعلان ڪريو ۽ ان کي هڪ اعتراض تفويض ڪريو جيڪو ان جي اولاد مان هڪ مثال آهي. توهان کي گهڻو ڪري پڇيو ويندو ته ڪمپلر تفويض آپريٽر جي کاٻي ۽ ساڄي پاسي بيان ڪيل قسمن جي غير مطابقت تي ڇو نه ڦٽو ڪندو آهي - آخرڪار، جاوا مضبوط طور تي ٽائپ ڪيو ويو آهي. وضاحت ڪريو ته هڪ وسيع قسم جي تبديلي هتي ڪم ڪري رهي آهي - هڪ اعتراض جو حوالو ان جي بنيادي طبقي جي حوالي سان سمجهيو ويندو آهي. وڌيڪ ڇا آهي، ڪوڊ ۾ اهڙي تعمير سان منهن ڏيڻ، گڏ ڪرڻ وارو خودڪار طريقي سان تبديل ڪري ٿو ۽ واضح طور تي. نموني ڪوڊ ڏيکاري ٿو ته قسم جو اعلان ڪيل اسائنمنٽ آپريٽر جي کاٻي پاسي ( ڊانسر ) ڪيترن ئي فارمن (قسم) تي مشتمل آهي، جيڪي ساڄي پاسي تي اعلان ڪيا ويا آهن ( Breakdancer , ElectricBoogieDancer ). هر فارم کي سپر ڪلاس ( ڊانس جو طريقو) ۾ بيان ڪيل عام ڪارڪردگيءَ جي حوالي سان پنهنجو منفرد رويو ٿي سگهي ٿو . اهو آهي، هڪ سپر ڪلاس ۾ اعلان ڪيل طريقو ان جي اولاد ۾ مختلف طريقي سان لاڳو ٿي سگهي ٿو. انهي صورت ۾، اسان طريقي سان ڊيل ڪري رهيا آهيون اوور رائيڊنگ، جيڪو بلڪل اهو آهي جيڪو ڪيترن ئي شڪلن (رويي) ٺاهي ٿو. اهو ڏسي سگھجي ٿو مکيه طريقي سان ڪوڊ کي هلائڻ سان: پروگرام آئوٽ: مان فريڊ آهيان. مان 18 سالن جو آهيان. مان ٻين وانگر نچندو آهيان. مان جي آهيان. مان 19 سالن جو آهيان. مان بريڪ ڊانس! مان مارسيا آهيان. مان 20 سالن جو آهيان. مان ڊانس ڪريان ٿو برقي بوگي! جيڪڏهن اسان ذيلي طبقن ۾ طريقي کي ختم نه ڪندا آهيون، پوء اسان مختلف رويي حاصل نه ڪنداسين. مثال طور، جيڪڏهن اسان پنهنجي Breakdancer ۽ ElectricBoogieDancer ڪلاسن ۾ ڊانس جي طريقي تي تبصرو ڪريون ٿا ، ته پوءِ پروگرام جو نتيجو هي هوندو: مان فريڊ آهيان. مان 18 سالن جو آهيان. مان ٻين وانگر نچندو آهيان. مان جي آهيان. مان 19 سالن جو آهيان. مان ٻين وانگر نچندو آهيان. مان مارسيا آهيان. مان 20 سالن جو آهيان. مان ٻين وانگر نچندو آهيان. ۽ هن جو مطلب اهو آهي ته اهو آسان ناهي ته Breakdancer ۽ ElectricBoogieDancer طبقن ٺاهڻ لاء. پوليمورفيزم جو اصول ڪٿي خاص طور تي ظاهر ٿئي ٿو؟ پروگرام ۾ استعمال ٿيل اعتراض ڪٿي آهي ان جي مخصوص قسم جي ڄاڻ کان سواء؟ اسان جي مثال ۾، اهو ٿئي ٿو جڏهن ڊانس () طريقو ڊانسر ڊي اعتراض تي سڏيو ويندو آهي. جاوا ۾، پوليمورفيزم جو مطلب آهي ته پروگرام کي اهو ڄاڻڻ جي ضرورت ناهي ته ڇا اعتراض هڪ Breakdancer يا ElectricBoogieDancer آهي . اهم ڳالهه اها آهي ته اهو ڊانسر طبقي جو اولاد آهي . ۽ جيڪڏهن توهان اولاد جو ذڪر ڪيو ٿا، توهان کي ياد رکڻ گهرجي ته جاوا ۾ وراثت نه رڳو وڌندي آهي ، پر پڻ لاڳو ٿئي ٿي . . هاڻي اهو ذڪر ڪرڻ جو وقت آهي ته جاوا ڪيترن ئي ورثي جي حمايت نه ڪندو آهي - هر قسم ۾ هڪ والدين (سپر ڪلاس) ۽ اولاد جي لامحدود تعداد (ذيلي طبقن) ٿي سگهي ٿو. ان جي مطابق، انٽرفيس استعمال ڪيا ويندا آھن ڪيترن ئي سيٽن کي ڪلاس ۾ شامل ڪرڻ لاءِ. ذيلي طبقن (وراثت) جي مقابلي ۾، انٽرفيس والدين طبقي سان گهٽ ملندڙ آهن. اهي تمام وڏي پيماني تي استعمال ٿيندا آهن. جاوا ۾، هڪ انٽرفيس هڪ ريفرنس جو قسم آهي، تنهن ڪري پروگرام انٽرفيس جي قسم جو هڪ متغير بيان ڪري سگهي ٿو. هاڻي اهو هڪ مثال ڏيڻ جو وقت آهي. هڪ انٽرفيس ٺاهيو:
public interface CanSwim {
    void swim();
}
وضاحت لاءِ، اسين مختلف غير لاڳاپيل طبقن کي کڻنداسين ۽ انھن کي انٽرفيس تي عمل ۾ آڻينداسين:
public class Human implements CanSwim {
    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 inflated tube.");
    }

    @Override
    public String toString() {
        return "I'm " + name + ". I'm " + age + " years old.";
    }

}

public class Fish implements CanSwim {
    private String name;

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

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

    }

public class UBoat implements CanSwim {

    private int speed;

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

    @Override
    public void swim() {
        System.out.println("I'm a submarine that swims through the water by rotating screw propellers. My speed is " + speed + " knots.");
    }
}
مکيه طريقو:
public class Main {

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

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

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

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

ڪجھ جدا جدا لفظ

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