JavaRush /جاوا بلاگ /Random-SD /پوليمورفيزم ۽ ان جا دوست
Viacheslav
سطح

پوليمورفيزم ۽ ان جا دوست

گروپ ۾ شايع ٿيل
پوليمورفيزم اعتراض جي بنياد تي پروگرامنگ جي بنيادي اصولن مان هڪ آهي. اهو توهان کي جاوا جي مضبوط ٽائپنگ جي طاقت کي استعمال ڪرڻ ۽ قابل استعمال ۽ برقرار رکڻ وارو ڪوڊ لکڻ جي اجازت ڏئي ٿو. هن جي باري ۾ گهڻو ڪجهه چيو ويو آهي، پر مون کي اميد آهي ته هرڪو هن جائزي مان ڪجهه نئون وٺي سگهي ٿو.
پوليمورفيزم ۽ ان جا دوست - 1

تعارف

مان سمجهان ٿو ته اسان سڀ ڄاڻون ٿا ته جاوا پروگرامنگ ٻولي Oracle سان تعلق رکي ٿي. تنهن ڪري، اسان جو رستو شروع ٿئي ٿو سائيٽ سان: www.oracle.com . مکيه صفحي تي ھڪڙو "مينيو" آھي. ان ۾، "دستاويزن" سيڪشن ۾ ھڪڙو "جاوا" سبسيڪشن آھي. هر شيءِ جيڪا ٻوليءَ جي بنيادي ڪمن سان واسطو رکي ٿي "جاوا SE دستاويزن" سان تعلق رکي ٿي، تنهنڪري اسان هن حصي کي چونڊيو ٿا. دستاويزي سيڪشن تازو ورزن لاءِ کوليندو، پر هن وقت لاءِ "هڪ مختلف رليز لاءِ ڳولي رهيا آهيو؟" اچو ته اختيار چونڊيو: JDK8. صفحي تي اسان ڪيترن ئي مختلف اختيارن کي ڏسندا. پر اسان کي ٻولي سکڻ ۾ دلچسپي آهي: " Java Tutorials Learning Paths ". هن صفحي تي اسان کي ٻيو حصو ملندو: " Learning the Java Language ". هي سڀ کان وڌيڪ مقدس آهي، جاوا جي بنيادي ڳالهين تي هڪ سبق Oracle کان. جاوا هڪ اعتراض تي مبني پروگرامنگ ٻولي (OOP) آهي، تنهنڪري ٻولي سکڻ جي شروعات Oracle ويب سائيٽ تي پڻ " Object-Oriented Programming Concepts " جي بنيادي تصورن جي بحث سان ٿيندي آهي. نالي مان ئي اهو واضح ٿئي ٿو ته جاوا شين سان ڪم ڪرڻ تي مرکوز آهي. " Abject ڇا آهي؟ " جي ذيلي حصي مان ، اهو واضح آهي ته جاوا ۾ شيون رياست ۽ رويي تي مشتمل آهن. تصور ڪريو ته اسان وٽ هڪ بئنڪ اڪائونٽ آهي. اڪائونٽ ۾ رقم جي رقم هڪ رياست آهي، ۽ هن رياست سان ڪم ڪرڻ جا طريقا رويي آهن. شين کي ڪنهن نه ڪنهن طرح بيان ڪرڻ جي ضرورت آهي (ٻڌاءِ ته انهن جي ڪهڙي حالت ۽ رويي ٿي سگهي ٿي) ۽ هي وضاحت آهي ڪلاس . جڏهن اسان ڪنهن ڪلاس جو هڪ اعتراض ٺاهيندا آهيون، اسان هن ڪلاس کي بيان ڪندا آهيون ۽ ان کي " آبجڪٽ جو قسم " سڏيو ويندو آهي. انهيءَ ڪري چئبو آهي ته جاوا هڪ مضبوط ٽائيپ ٿيل ٻولي آهي، جيئن جاوا ٻوليءَ جي وضاحت ۾ سيڪشن 4. قسم، قدر ۽ متغيرات ۾ بيان ڪيل آهي . جاوا ٻولي OOP تصورن جي پيروي ڪري ٿي ۽ وراثت کي سپورٽ ڪري ٿي Extensed keyword استعمال ڪندي . توسيع ڇو؟ ڇاڪاڻ ته وراثت سان، هڪ ٻار طبقو والدين طبقي جي رويي ۽ حالت کي وراثت ڏئي ٿو ۽ انهن کي پورو ڪري سگهي ٿو، يعني. بنيادي طبقي جي ڪارڪردگي کي وڌايو. هڪ انٽرفيس پڻ وضاحت ڪري سگهجي ٿو ڪلاس جي وضاحت ۾ لاڳو ڪيل لفظ استعمال ڪندي. جڏهن هڪ ڪلاس هڪ انٽرفيس کي لاڳو ڪري ٿو، ان جو مطلب آهي ته طبقو ڪجهه معاهدي جي مطابق آهي - پروگرامر طرفان هڪ اعلان باقي ماحول کي ته طبقي جو هڪ خاص رويو آهي. مثال طور، پليئر وٽ مختلف بٽڻ آھن. اهي بٽڻ پليئر جي رويي کي ڪنٽرول ڪرڻ لاءِ هڪ انٽرفيس آهن، ۽ اهو رويو پليئر جي اندروني حالت کي تبديل ڪندو (مثال طور حجم). هن معاملي ۾، رياست ۽ رويي جي وضاحت طور هڪ طبقي ڏيندو. جيڪڏهن ڪو ڪلاس هڪ انٽرفيس کي لاڳو ڪري ٿو، ته پوءِ هن ڪلاس کي استعمال ڪندي ٺاهيل شئي کي نه رڳو ڪلاس ذريعي، پر انٽرفيس ذريعي پڻ بيان ڪري سگهجي ٿو. اچو ته هڪ مثال ڏسو:
public class MusicPlayer {

    public static interface Device {
        public void turnOn();
        public void turnOff();
    }

    public static class Mp3Player implements Device {
        public void turnOn() {
            System.out.println("On. Ready for mp3.");
        }
        public void turnOff() {
            System.out.println("Off");
        }
    }

    public static class Mp4Player extends Mp3Player {
        @Override
        public void turnOn() {
            System.out.println("On. Ready for mp3/mp4.");
        }
    }

    public static void main(String []args) throws Exception{
        // Какое-то устройство (Тип = Device)
        Device mp3Player = new Mp3Player();
        mp3Player.turnOn();
        // У нас есть mp4 проигрыватель, но нам от него нужно только mp3
        // Пользуемся им How mp3 проигрывателем (Тип = Mp3Player)
        Mp3Player mp4Player = new Mp4Player();
        mp4Player.turnOn();
    }
}
قسم هڪ تمام اهم وضاحت آهي. اهو ٻڌائي ٿو ته اسان ڪيئن ڪم ڪرڻ وارا آهيون اعتراض سان، يعني. اسان کي اعتراض کان ڪهڙي رويي جي توقع آهي. رويي جا طريقا آهن. تنهن ڪري، اچو ته طريقن کي سمجھو. Oracle ويب سائيٽ تي، طريقن جو پنهنجو حصو آهي Oracle Tutorial ۾: " طريقن جي وضاحت ". آرٽيڪل مان ڪڍڻ لاءِ پهرين شيءِ: هڪ طريقي جي نشاني آهي طريقي جو نالو ۽ پيرا ميٽرن جا قسم :
پوليمورفيزم ۽ ان جا دوست - 2
مثال طور، جڏهن هڪ طريقي جو اعلان ڪيو عوامي باطل طريقو (Object o)، دستخط ٿيندو طريقو جو نالو ۽ پيٽرولر جو قسم. واپسي جو قسم دستخط ۾ شامل نه آهي. اهو ضروري آهي! اڳيون، اچو ته اسان جو سورس ڪوڊ گڏ ڪريون. جيئن اسان ڄاڻون ٿا، ان لاءِ ڪوڊ کي فائل ۾ محفوظ ڪيو وڃي ڪلاس جي نالي ۽ ايڪسٽينشن جاوا سان. جاوا ڪوڊ مرتب ڪيو ويو آهي " javac " ڪمپيلر استعمال ڪندي ڪجهه وچولي فارميٽ ۾ جيڪو جاوا ورچوئل مشين (JVM) ذريعي عمل ڪري سگهجي ٿو. هي وچولي فارميٽ بائيٽ ڪوڊ سڏيو ويندو آهي ۽ .class ايڪسٽينشن سان فائلن ۾ شامل هوندو آهي. اچو ته ڪمپائل ڪرڻ لاءِ ڪمانڊ هلون: javac MusicPlayer.java جاوا ڪوڊ مرتب ٿيڻ کان پوءِ، اسان ان کي عمل ۾ آڻي سگھون ٿا. شروع ڪرڻ لاءِ " java " يوٽيلٽي استعمال ڪندي، جاوا ورچوئل مشين جو عمل شروع ڪيو ويندو بائيٽ ڪوڊ کي ڪلاس فائل ۾ پاس ڪرڻ لاءِ. اچو ته ايپليڪيشن لانچ ڪرڻ لاءِ ڪمانڊ هلون: java MusicPlayer. اسان اسڪرين تي ڏسندا سين ته متن بيان ڪيو ويو آهي پرنٽ ايلن طريقي جي ان پٽ پيراميٽر ۾. دلچسپ ڳالهه اها آهي ته .class ايڪسٽينشن سان فائل ۾ بائيٽ ڪوڊ هجڻ ڪري، اسان ان کي " javap " يوٽيليٽي استعمال ڪري ڏسي سگهون ٿا. اچو ته ڪمانڊ هلون <ocde>javap -c MusicPlayer:
پوليمورفيزم ۽ ان جا دوست - 3
بائيٽ ڪوڊ مان اسان ڏسي سگهون ٿا ته ڪنهن شئي ذريعي ميٿڊ ڪال ڪرڻ جنهن جي قسم جو ڪلاس بيان ڪيو ويو هو استعمال ڪندي ڪيو ويو آهي invokevirtual، ۽ ڪمپلر حساب ڪيو آهي ته ڪهڙي طريقي جي دستخط کي استعمال ڪرڻ گهرجي. ڇو invokevirtual؟ ڇاڪاڻ ته هڪ مجازي طريقي جي هڪ ڪال آهي (دعوت سڏيو ويندو آهي ڪالنگ). هڪ مجازي طريقو ڇا آهي؟ اهو هڪ طريقو آهي جنهن جي جسم کي پروگرام جي عمل دوران ختم ڪري سگهجي ٿو. بس تصور ڪريو ته توھان وٽ ھڪڙي خاص ڪنجي (طريقي دستخط) ۽ طريقي جي جسم (ڪوڊ) جي وچ ۾ خط و ڪتابت جي ھڪڙي فهرست آھي. ۽ هي خطوط ۽ طريقي جي جسم جي وچ ۾ پروگرام جي عمل دوران تبديل ٿي سگھي ٿو. تنهن ڪري اهو طريقو مجازي آهي. ڊفالٽ طور، جاوا ۾، طريقا جيڪي نه جامد آهن، نه حتمي، ۽ نه پرائيويٽ آهن مجازي. انهي جي مهرباني، جاوا پوليمورفيزم جي اعتراض تي مبني پروگرامنگ اصول کي سپورٽ ڪري ٿو. جيئن توهان اڳ ۾ ئي سمجهي سگهون ٿا، اهو آهي جيڪو اسان جو جائزو اڄ بابت آهي.

پوليمورفيزم

Oracle ويب سائيٽ تي انهن جي سرڪاري ٽيوٽوريل ۾ هڪ الڳ سيڪشن آهي: " پوليمورفيزم ". اچو ته جاوا آن لائن ڪمپلر استعمال ڪريون ڏسون ته جاوا ۾ پوليمورفيزم ڪيئن ڪم ڪري ٿو. مثال طور، اسان وٽ ڪجھ خلاصو ڪلاس نمبر آھي جيڪو جاوا ۾ ھڪڙي نمبر جي نمائندگي ڪري ٿو. اها ڪهڙي اجازت ڏئي ٿي؟ هن وٽ ڪجهه بنيادي ٽيڪنالاجيون آهن جيڪي سڀني وارثن وٽ هونديون. ڪو به ماڻهو جيڪو نمبر مان ورثي ۾ اچي ٿو لفظي طور تي چوي ٿو - "مان هڪ نمبر آهيان، توهان مون سان گڏ ڪم ڪري سگهو ٿا هڪ نمبر." مثال طور، ڪنهن به جانشين لاءِ توهان استعمال ڪري سگهو ٿا intValue() طريقو ان جي انٽيجر قيمت حاصل ڪرڻ لاءِ. جيڪڏھن توھان ڏسو java api لاءِ نمبر، توھان ڏسي سگھو ٿا ته طريقو خلاصو آھي، اھو آھي، نمبر جي ھر جانشين کي ھن طريقي تي عمل ڪرڻ گھرجي. پر هي اسان کي ڇا ڏئي ٿو؟ اچو ته هڪ مثال ڏسو:
public class HelloWorld {

    public static int summ(Number first, Number second) {
        return first.intValue() + second.intValue();
    }

    public static void main(String []args){
        System.out.println(summ(1, 2));
        System.out.println(summ(1L, 4L));
        System.out.println(summ(1L, 5));
        System.out.println(summ(1.0, 3));
    }
}
جيئن مثال مان ڏسي سگهجي ٿو، پوليمورفيزم جي مهرباني، اسان هڪ طريقو لکي سگهون ٿا جيڪو ڪنهن به قسم جي دليلن کي ان پٽ طور قبول ڪندو، جيڪو نمبر جو اولاد هوندو (اسان نمبر حاصل نٿا ڪري سگهون، ڇاڪاڻ ته اهو هڪ خلاصو طبقو آهي). جيئن پليئر مثال سان معاملو هو، هن صورت ۾ اسان اهو چئي رهيا آهيون ته اسان ڪجهه ڪم ڪرڻ چاهيون ٿا، جهڙوڪ نمبر. اسان ڄاڻون ٿا ته جيڪو به هڪ نمبر آهي ان جي عددي قيمت کي فراهم ڪرڻ جي قابل هوندو. ۽ اهو اسان لاء ڪافي آهي. اسان نه ٿا چاهيون ته ڪنهن مخصوص شئي جي عمل درآمد جي تفصيل ۾ وڃو ۽ ان شئي سان ڪم ڪرڻ چاهيون ٿا انهن طريقن جي ذريعي جيڪي نمبر جي سڀني نسلن لاءِ عام آهن. طريقن جي فهرست جيڪا اسان وٽ دستياب هوندي، ترتيب ڏيڻ وقت قسم جي حساب سان طئي ڪئي ويندي (جيئن اسان اڳ ۾ بائيٽ ڪوڊ ۾ ڏٺو). انهي صورت ۾، اسان جو قسم نمبر هوندو. جيئن توهان مثال مان ڏسي سگهو ٿا، اسان مختلف قسمن جا مختلف نمبر پاس ڪري رهيا آهيون، اهو آهي، سمم طريقو ان پٽ جي طور تي Integer، Long، ۽ Double وصول ڪندو. پر انهن سڀني ۾ مشترڪه ڳالهه اها آهي ته اهي تجريدي نمبر جا اولاد آهن، ۽ ان ڪري انهن جي رويي کي intValue طريقي سان ختم ڪيو وڃي ٿو، ڇاڪاڻ ته هر مخصوص قسم ڄاڻي ٿو ته ان قسم کي Integer ۾ ڪيئن اڇلائي. اهڙي قسم جي پوليمورفيزم کي انگريزيءَ ۾ اوور رائيڊنگ (Overriding) ذريعي لاڳو ڪيو ويندو آهي.
پوليمورفيزم ۽ ان جا دوست - 4
اوور رائيڊنگ يا متحرڪ پوليمورفيزم. سو، اچو ته ھيٺ ڏنل مواد سان HelloWorld.java فائل کي محفوظ ڪندي شروع ڪريون:
public class HelloWorld {
    public static class Parent {
        public void method() {
            System.out.println("Parent");
        }
    }
    public static class Child extends Parent {
        public void method() {
            System.out.println("Child");
        }
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent child = new Child();
        parent.method();
        child.method();
    }
}
اچو ته ڪريون javac HelloWorld.java۽ javap -c HelloWorld:
پوليمورفيزم ۽ ان جا دوست - 5
جئين توهان ڏسي سگهو ٿا، بائيٽ ڪوڊ ۾ لائنن لاء هڪ طريقو ڪال سان، ساڳئي حوالن کي ڪال ڪرڻ جو طريقو اشارو ڪيو ويو آهي invokevirtual (#6). اچو ته اهو ڪريون java HelloWorld. جيئن ته اسان ڏسي سگهون ٿا، متغير والدين ۽ ٻار کي قسم Parent سان قرار ڏنو ويو آهي، پر عمل درآمد پاڻ کي سڏيو ويندو آهي ان جي مطابق ڪهڙي شئي متغير کي مقرر ڪيو ويو آهي (يعني ڪهڙي قسم جو اعتراض). پروگرام جي عمل جي دوران (اهي رن ٽائم ۾ به چوندا آهن)، JVM، اعتراض تي منحصر ڪري، جڏهن طريقن کي ڪال ڪندي ساڳئي دستخط استعمال ڪندي، مختلف طريقن سان عمل ڪيو. اهو آهي، لاڳاپيل دستخط جي ڪنجي کي استعمال ڪندي، اسان پهريون ڀيرو هڪ طريقو جسم حاصل ڪيو، ۽ پوء ٻيو حاصل ڪيو. متغير ۾ ڪهڙي شئي تي منحصر آهي. پروگرام جي عمل جي وقت ۾ اهو طئي ڪيو وڃي ٿو ته ڪهڙي طريقي کي سڏيو ويندو پڻ دير سان پابند يا متحرڪ پابند سڏيو ويندو آهي. اهو آهي، دستخط ۽ طريقي جي جسم جي وچ ۾ ميلاپ متحرڪ طور تي ڪيو ويندو آهي، ان اعتراض تي منحصر آهي جنهن تي طريقو سڏيو ويندو آهي. قدرتي طور تي، توهان ڪلاس جي جامد ميمبرن کي اوور رائيڊ نٿا ڪري سگهو (ڪلاس ميمبر)، انهي سان گڏ ڪلاس جي ميمبرن کي رسائي واري قسم جي نجي يا فائنل سان. @Override تشريحون پڻ ڊولپرز جي مدد لاءِ اچن ٿيون. اهو ڪمپيلر کي سمجهڻ ۾ مدد ڪري ٿو ته هن نقطي تي اسان هڪ اباڻي طريقي جي رويي کي ختم ڪرڻ وارا آهيون. جيڪڏهن اسان طريقي جي دستخط ۾ غلطي ڪئي، مرتب ڪندڙ اسان کي فوري طور تي ان بابت ٻڌائيندو. مثال طور:
public static class Parent {
        public void method() {
            System.out.println("parent");
        }
}
public static class Child extends Parent {
        @Override
        public void method(String text) {
            System.out.println("child");
        }
}
غلطي سان گڏ نه ڪيو ويو آهي: غلطي: طريقو سپرٽائپ مان هڪ طريقو اووررائيڊ يا لاڳو نٿو ڪري
پوليمورفيزم ۽ ان جا دوست - 6
وري وصف به ” covariance “ جي تصور سان جڙيل آهي . اچو ته هڪ مثال ڏسو:
public class HelloWorld {
    public static class Parent {
        public Number method() {
            return 1;
        }
    }
    public static class Child extends Parent {
        @Override
        public Integer method() {
            return 2;
        }
    }

    public static void main(String[] args) {
        System.out.println(new Child().method());
    }
}
ظاهري ناانصافي جي باوجود، معنيٰ ان حقيقت تي اچي ٿي ته جڏهن ان کي ختم ڪري، اسان نه رڳو اهو واپس ڪري سگهون ٿا، جيڪو اڳين ۾ بيان ڪيو ويو هو، پر هڪ وڌيڪ مخصوص قسم پڻ. مثال طور، ابن ڏاڏن جو نمبر واپس آيو، ۽ اسان واپس ڪري سگھون ٿا Integer - نمبر جو اولاد. ساڳيءَ طرح لاڳو ٿئي ٿو استثناءَ تي بيان ڪيل طريقن جي اڇل ۾. وارثن طريقي کي ختم ڪري سگھن ٿا ۽ استثنا کي رد ڪري سگھن ٿا. پر اهي وڌائي نه سگهندا آهن. اهو آهي، جيڪڏهن والدين هڪ IOException اڇلائي، پوء اسان وڌيڪ صحيح EOFException اڇلائي سگهون ٿا، پر اسان هڪ استثنا اڇلائي نٿا سگهون. ساڳئي طرح، توهان دائري کي تنگ نه ٿا ڪري سگهو ۽ توهان اضافي پابنديون لاڳو نٿا ڪري سگهو. مثال طور، توھان جامد شامل نٿا ڪري سگھو.
پوليمورفيزم ۽ ان جا دوست - 7

لڪائڻ

اتي پڻ " لڪائڻ " وانگر هڪ شيء آهي . مثال:
public class HelloWorld {
    public static class Parent {
        public static void method() {
            System.out.println("Parent");
        }
    }
    public static class Child extends Parent {
        public static void method() {
            System.out.println("Child");
        }
    }

    public static void main(String[] args) {
        Parent parent = new Parent();
        Parent child = new Child();
        parent.method();
        child.method();
    }
}
اهو هڪ خوبصورت واضح شيء آهي جيڪڏهن توهان ان بابت سوچيو. هڪ طبقي جا جامد ميمبر طبقن سان تعلق رکن ٿا، يعني. variable جي قسم ڏانهن. تنهن ڪري، اهو منطقي آهي ته جيڪڏهن ٻار والدين جي قسم جو آهي، ته پوء اهو طريقو والدين کي سڏيو ويندو، ٻار تي نه. جيڪڏهن اسان بائيٽ ڪوڊ تي نظر رکون ٿا، جيئن اسان اڳ ڪيو هو، اسان ڏسنداسين ته جامد طريقو سڏيو ويندو آهي invokestatic استعمال ڪندي. اهو JVM کي وضاحت ڪري ٿو ته ان کي قسم کي ڏسڻ جي ضرورت آهي، ۽ طريقي جي ميز تي نه، جيئن invokevirtual يا invokeinterface ڪيو.
پوليمورفيزم ۽ ان جا دوست - 8

اوور لوڊ ڪرڻ جا طريقا

اسان جاوا Oracle Tutorial ۾ ٻيو ڇا ٿا ڏسو؟ اڳئين اڀياس واري حصي ۾ " مطالع ڪرڻ جا طريقا " اوورلوڊنگ بابت ڪجهه آهي. هي ڇا آهي؟ روسي ۾ هن "طريقو overloading" آهي، ۽ اهڙي طريقن کي سڏيو ويندو آهي "overloaded". تنهن ڪري، اوور لوڊ ڪرڻ جو طريقو. پهرين نظر ۾، هر شيء سادو آهي. اچو ته هڪ آن لائن جاوا ڪمپلر کوليون، مثال طور tutorialspoint online java compiler .
public class HelloWorld {

	public static void main(String []args){
		HelloWorld hw = new HelloWorld();
		hw.say(1);
		hw.say("1");
	}

	public static void say(Integer number) {
		System.out.println("Integer " + number);
	}
	public static void say(String number) {
		System.out.println("String " + number);
	}
}
تنهن ڪري، هتي هر شيء سادو لڳي. جيئن چيو ويو آهي Oracle ٽيوٽوريل ۾، اوور لوڊ ٿيل طريقا (هن صورت ۾ چئجي جو طريقو) مختلف آهن انگ ۽ قسم ۾ دليلن جي طريقي سان گذري ويا. توھان بيان نٿا ڪري سگھوٿا ساڳيو نالو ۽ ساڳيا تعداد جي ھڪڙي قسم جي دليلن جي، ڇاڪاڻ ته مرتب ڪندڙ انهن کي هڪ ٻئي کان ڌار ڪرڻ جي قابل نه هوندا. اهو هڪ تمام اهم شيء کي فوري طور تي نوٽ ڪرڻ جي قابل آهي:
پوليمورفيزم ۽ ان جا دوست - 9
اهو آهي، جڏهن اوور لوڊ ڪندي، مرتب ڪندڙ صحيحيت جي جانچ ڪري ٿو. اهو ضروري آهي. پر ڪئين گڏ ڪرڻ وارو اصل ۾ اهو طئي ڪري ٿو ته هڪ خاص طريقي کي سڏيو وڃي ٿو؟ اهو استعمال ڪري ٿو "سڀ کان وڌيڪ مخصوص طريقو" ضابطو بيان ڪيل جاوا ٻولي جي وضاحت ۾: " 15.12.2.5. سڀ کان وڌيڪ مخصوص طريقو چونڊڻ ". اهو ڏيکارڻ لاءِ ته اهو ڪيئن ڪم ڪري ٿو، اچو ته هڪ مثال وٺون Oracle Certified Professional Java Programmer مان:
public class Overload{
  public void method(Object o) {
    System.out.println("Object");
  }
  public void method(java.io.FileNotFoundException f) {
    System.out.println("FileNotFoundException");
  }
  public void method(java.io.IOException i) {
    System.out.println("IOException");
  }
  public static void main(String args[]) {
    Overload test = new Overload();
    test.method(null);
  }
}
هتي مان هڪ مثال وٺو: https://github.com/stokito/OCPJP/blob/master/src/ru/habrahabr/blogs/java/OCPJP1/question1/Overload.j... جيئن توهان ڏسي سگهو ٿا، اسان گذري رهيا آهيون. طريقي سان null. مرتب ڪندڙ سڀ کان وڌيڪ مخصوص قسم کي طئي ڪرڻ جي ڪوشش ڪري ٿو. اعتراض مناسب نه آهي ڇاڪاڻ ته سڀ ڪجهه هن کان ورثي ۾ آهي. اڳتي وڃو. استثنا جا 2 طبقا آهن. اچو ته ڏسو java.io.IOException ۽ ڏسو ته ”سڌي سڃاتل ذيلي ڪلاسز“ ۾ هڪ FileNotFoundException موجود آهي. اهو آهي، اهو ظاهر ٿئي ٿو ته FileNotFoundException سڀ کان وڌيڪ مخصوص قسم آهي. تنهن ڪري، نتيجو ٿيندو "FileNotFoundException" اسٽرنگ جو نتيجو. پر جيڪڏهن اسان IOException کي EOFException سان تبديل ڪريون ٿا، اهو ظاهر ٿئي ٿو ته اسان وٽ قسم جي وڻ ۾ درجه بندي جي ساڳئي سطح تي ٻه طريقا آهن، اهو آهي، انهن ٻنهي لاء، IOException والدين آهي. گڏ ڪرڻ وارو اهو چونڊڻ جي قابل نه هوندو ته ڪهڙو طريقو ڪال ڪرڻ ۽ هڪ تاليف جي غلطي اڇلائي ڇڏيندو: reference to method is ambiguous. هڪ وڌيڪ مثال:
public class Overload{
    public static void method(int... array) {
        System.out.println("1");
    }

    public static void main(String args[]) {
        method(1, 2);
    }
}
اهو نڪرندو 1. هتي ڪي به سوال نه آهن. قسم int... هڪ ورارگ https://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html آهي ۽ حقيقت ۾ ”سنٽيڪڪ شوگر“ کان وڌيڪ ڪجهه به ناهي ۽ اصل ۾ هڪ int آهي. .. array کي int[] array طور پڙهي سگھجي ٿو. جيڪڏهن اسان هاڻي هڪ طريقو شامل ڪيو:
public static void method(long a, long b) {
	System.out.println("2");
}
پوء اهو ڏيکاريندو 1 نه، پر 2، ڇاڪاڻ ته اسان 2 نمبر پاس ڪري رهيا آهيون، ۽ 2 دليل هڪ صف کان بهتر ميچ آهن. جيڪڏهن اسان هڪ طريقو شامل ڪيو:
public static void method(Integer a, Integer b) {
	System.out.println("3");
}
پوء اسان کي اڃا به ڏسندا 2. ڇاڪاڻ ته هن معاملي ۾ primitives هڪ وڌيڪ صحيح ميچ آهي Integer ۾ باڪسنگ کان. بهرحال، جيڪڏهن اسان عمل ڪريون ٿا، method(new Integer(1), new Integer(2));اهو 3 پرنٽ ڪندو. جاوا ۾ تعمير ڪندڙ طريقن سان ملندڙ جلندڙ آهن، ۽ جيئن ته اهي پڻ هڪ دستخط حاصل ڪرڻ لاء استعمال ڪري سگھجن ٿيون، ساڳيو "اوور لوڊ ڪرڻ واري قرارداد" ضابطن تي لاڳو ٿئي ٿو اوورلوڊ طريقن جي طور تي. جاوا ٻولي جي وضاحت اسان کي " 8.8.8. Constructor Overloading " ۾ ٻڌائي ٿي. طريقو اوورلوڊ = Early binding (aka Static Binding) توھان اڪثر ٻڌو ٿا شروعاتي ۽ دير سان بائنڊنگ بابت، جنھن کي Static Binding يا Dynamic Binding پڻ چيو ويندو آھي. انهن جي وچ ۾ فرق بلڪل سادو آهي. شروعاتي تاليف آهي، دير سان اهو وقت آهي جڏهن پروگرام تي عمل ڪيو ويو آهي. تنهن ڪري، ابتدائي بائنڊنگ (جامد بائنڊنگ) اهو طئي ڪيو ويو آهي ته ڪهڙي طريقي کي سڏيو ويندو جنهن کي ترتيب ڏيڻ وقت. خير، دير سان بائنڊنگ (متحرڪ بائنڊنگ) اهو طئي ڪرڻ آهي ته ڪهڙي طريقي سان پروگرام جي عمل جي وقت تي سڌو سنئون فون ڪيو وڃي. جيئن اسان اڳ ۾ ڏٺو (جڏهن اسان IOException کي EOFException ۾ تبديل ڪيو)، جيڪڏهن اسان طريقن کي اوورلوڊ ڪريون ٿا ته جيئن گڏ ڪرڻ وارو اهو نه سمجهي سگهي ته ڪهڙي ڪال ڪرڻي آهي، ته پوءِ اسان کي هڪ مرتب وقت جي غلطي ملندي: طريقي جو حوالو مبهم آهي. انگريزيءَ مان ترجمو ٿيل لفظ مبهم يا غير يقيني، غلط. اهو ظاهر ٿئي ٿو ته اوورلوڊ شروعاتي پابند آهي، ڇاڪاڻ ته چڪاس وقت تي ڪيو ويندو آهي. اسان جي نتيجن جي تصديق ڪرڻ لاء، اچو ته جاوا ٻوليء جي وضاحت کي باب " 8.4.9. Overloading " تي کوليو:
پوليمورفيزم ۽ ان جا دوست - 10
اهو ظاهر ٿئي ٿو ته تاليف جي دوران، قسم ۽ دليلن جي تعداد بابت معلومات (جيڪو تاليف جي وقت تي دستياب آهي) طريقي جي دستخط کي طئي ڪرڻ لاء استعمال ڪيو ويندو. جيڪڏهن طريقو اعتراض جي طريقن مان هڪ آهي (يعني مثال جو طريقو)، حقيقي طريقو ڪال مقرر ڪيو ويندو رن ٽائم تي متحرڪ طريقو ڏسڻ (يعني متحرڪ پابند) استعمال ڪندي. ان کي واضح ڪرڻ لاءِ، اچو ته هڪ مثال وٺون، جيڪو اڳئين بحث سان ملندڙ جلندڙ آهي:
public class HelloWorld {
    public void method(int intNumber) {
        System.out.println("intNumber");
    }
    public void method(Integer intNumber) {
        System.out.println("Integer");
    }
    public void method(String intNumber) {
        System.out.println("Number is: " + intNumber);
    }

    public static void main(String args[]) {
        HelloWorld test = new HelloWorld();
        test.method(2);
    }
}
اچو ته هن ڪوڊ کي HelloWorld.java فائل ۾ محفوظ ڪريون ۽ ان کي استعمال ڪندي گڏ ڪريون javac HelloWorld.java هاڻي اچو ته ڏسون ته اسان جي ڪمپائلر بائيٽ ڪوڊ ۾ ڪمانڊ هلائيندي ڇا لکيو آهي: javap -verbose HelloWorld.
پوليمورفيزم ۽ ان جا دوست - 11
جيئن چيو ويو آهي، مرتب ڪندڙ اهو طئي ڪيو آهي ته ڪجهه مجازي طريقو مستقبل ۾ سڏيو ويندو. اهو آهي، طريقو جسم رن ٽائم تي بيان ڪيو ويندو. پر تاليف جي وقت، سڀني ٽن طريقن مان، مرتب ڪندڙ سڀ کان وڌيڪ موزون طريقو چونڊيو، تنهنڪري هن نمبر کي اشارو ڪيو:"invokevirtual #13"
پوليمورفيزم ۽ ان جا دوست - 12
هي ڪهڙي قسم جو طريقو آهي؟ هي طريقو جي لنڪ آهي. عام طور تي ڳالهائڻ، هي ڪجهه اشارو آهي جنهن جي ذريعي، رن ٽائم تي، جاوا ورچوئل مشين اصل ۾ اهو طئي ڪري سگهي ٿو ته ڪهڙي طريقي سان عمل ڪرڻ جي ڳولا ڪجي. وڌيڪ تفصيل ملي سگھن ٿا سپر آرٽيڪل ۾: " ڪيئن ڪندو آهي JVM طريقي سان اوور لوڊ ڪرڻ ۽ اوور رائيڊنگ اندروني طور تي ".

اختصار ڪرڻ

تنهن ڪري، اسان اهو معلوم ڪيو ته جاوا، هڪ اعتراض تي مبني ٻولي طور، پوليمورفيزم کي سپورٽ ڪري ٿو. پوليمورفيزم جامد (جامد پابند) يا متحرڪ (متحرڪ پابند) ٿي سگهي ٿو. جامد پوليمورفيزم سان، جيڪو ابتدائي بائنڊنگ جي نالي سان پڻ سڃاتو وڃي ٿو، مرتب ڪندڙ اهو طئي ڪري ٿو ته ڪهڙي طريقي کي سڏيو وڃي ۽ ڪٿي. هي هڪ ميڪانيزم جي استعمال جي اجازت ڏئي ٿو جهڙوڪ اوورلوڊ. متحرڪ پوليمورفيزم سان، جيڪو دير سان بائنڊنگ جي نالي سان پڻ سڃاتو وڃي ٿو، هڪ طريقي جي اڳوڻي ڳڻپيوڪر دستخط جي بنياد تي، هڪ طريقو رن ٽائم تي حساب ڪيو ويندو جنهن جي بنياد تي استعمال ڪيو ويو آهي (يعني، ڪهڙي شئي جو طريقو سڏيو ويندو آهي). هي ميکانيزم ڪيئن ڪم ڪري ٿو ڏسي سگھجي ٿو bytecode استعمال ڪندي. اوورلوڊ طريقي جي نشانين تي نظر اچي ٿو، ۽ اوورلوڊ کي حل ڪرڻ وقت، سڀ کان وڌيڪ مخصوص (سڀ کان وڌيڪ صحيح) اختيار چونڊيو ويندو آهي. Overriding قسم تي نظر اچي ٿو اهو طئي ڪرڻ لاءِ ته ڪهڙا طريقا موجود آهن، ۽ طريقا پاڻ کي اعتراض جي بنياد تي سڏيو وڃي ٿو. انهي سان گڏ موضوع تي مواد: #وياچسلاو
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION