JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ انٽرفيس

جاوا ۾ انٽرفيس

گروپ ۾ شايع ٿيل
سلام! اڄ اسان جاوا ۾ هڪ اهم تصور بابت ڳالهائينداسين - انٽرفيس. لفظ شايد توهان کي واقف آهي. مثال طور، اڪثر ڪمپيوٽر پروگرامن ۽ رانديون انٽرفيس آهن. هڪ وسيع معنى ۾، هڪ انٽرفيس هڪ قسم جو "ريموٽ ڪنٽرول" آهي جيڪو ٻن ڌرين کي ڳنڍي ٿو جيڪو هڪ ٻئي سان رابطو ڪري ٿو. روزمره جي زندگي مان هڪ انٽرفيس جو هڪ سادي مثال هڪ ٽي وي ريموٽ ڪنٽرول آهي. اهو ٻن شين کي ڳنڍي ٿو، هڪ شخص ۽ ٽي وي، ۽ مختلف ڪمن کي انجام ڏئي ٿو: حجم کي مٿي يا هيٺ ڪريو، چينل تبديل ڪريو، ٽي وي کي آن يا بند ڪريو. هڪ پاسي (ماڻهو) کي انٽرفيس تائين رسائي جي ضرورت آهي (ريموٽ ڪنٽرول بٽڻ کي دٻايو) ٻئي طرف عمل ڪرڻ لاءِ. مثال طور، ٽي وي لاء چينل کي ايندڙ هڪ ڏانهن تبديل ڪرڻ لاء. انهي حالت ۾، صارف کي ٽي وي جي ڊوائيس کي ڄاڻڻ جي ضرورت ناهي ۽ ان جي اندر چينل کي تبديل ڪرڻ جو عمل ڪيئن لاڳو ٿئي ٿو. ڇو جاوا ۾ انٽرفيس جي ضرورت آهي - 1سڀني صارفن تائين رسائي آهي انٽرفيس آهي . بنيادي ڪم گهربل نتيجو حاصل ڪرڻ آهي. ان جو پروگرامنگ ۽ جاوا سان ڇا تعلق آهي؟ Direct :) هڪ انٽرفيس ٺاهڻ هڪ باقاعده ڪلاس ٺاهڻ جي برابر آهي، پر لفظ جي بدران classاسين لفظ بيان ڪريون ٿا interface. اچو ته آسان ترين جاوا انٽرفيس کي ڏسو ۽ معلوم ڪريو ته اهو ڪيئن ڪم ڪري ٿو ۽ ان لاءِ ڪهڙي ضرورت آهي:
public interface Swimmable  {

     public void swim();
}
اسان ھڪڙو انٽرفيس ٺاھيو آھي Swimmableجيڪو ترڻ ڪري سگھي ٿو . اهو اسان جي ريموٽ ڪنٽرول وانگر آهي، جنهن ۾ هڪ "بٽڻ" آهي: طريقو swim() آهي "ترڻ". اسان هن " ريموٽ ڪنٽرول " کي ڪيئن استعمال ڪري سگهون ٿا؟ هن مقصد لاء طريقو، i.e. اسان جي ريموٽ ڪنٽرول تي بٽڻ تي عمل ڪرڻ جي ضرورت آهي. هڪ انٽرفيس استعمال ڪرڻ لاء، ان جا طريقا اسان جي پروگرام جي ڪجهه طبقن پاران لاڳو ٿيڻ گهرجن. اچو ته هڪ ڪلاس سان گڏ هلون جنهن جون شيون ”ترڻ ڪري سگهن“ جي وضاحت سان ٺهڪندڙ هجن. مثال طور، بتھ ڪلاس مناسب آھي Duck:
public class Duck implements Swimmable {

    public void swim() {
        System.out.println("Duck, swim!");
    }

    public static void main(String[] args) {

        Duck duck = new Duck();
        duck.swim();
    }
}
اسان هتي ڇا ٿا ڏسو؟ هڪ ڪلاس لفظ استعمال ڪندي Duckهڪ انٽرفيس سان لاڳاپيل آهي . جيڪڏهن توهان کي ياد آهي ته، اسان وراثت ۾ ٻن طبقن کي ڳنڍڻ لاء ساڳيو ميکانيزم استعمال ڪيو، صرف لفظ " وڌائي " هو. " " لفظي طور تي وضاحت لاء ترجمو ڪري سگهجي ٿو: "هڪ عوامي طبقو انٽرفيس کي لاڳو ڪري ٿو ." هن جو مطلب آهي ته هڪ انٽرفيس سان لاڳاپيل هڪ طبقي کي ان جي سڀني طريقن کي لاڳو ڪرڻ گهرجي. مهرباني ڪري نوٽ ڪريو: اسان جي ڪلاس ۾، صرف انٽرفيس وانگر ، اتي هڪ طريقو آهي ، ۽ ان جي اندر ڪجهه قسم جي منطق آهي. هي هڪ لازمي گهربل آهي. جيڪڏهن اسان صرف "" لکيو آهي ۽ ڪلاس ۾ هڪ طريقو نه ٺاهيو آهي ، مرتب ڪندڙ اسان کي هڪ غلطي ڏيندو: Duck abstract نه آهي ۽ نه ئي تجريدي طريقو swim() کي Swimmable ۾ اوور رائيڊ ڪري ٿو، ائين ڇو ٿئي ٿو؟ جيڪڏهن اسان ٽي وي جو مثال استعمال ڪندي غلطي جي وضاحت ڪريون ٿا، اهو ظاهر ٿئي ٿو ته اسان هڪ شخص کي ٽي وي مان "چينل تبديل ڪريو" جي بٽڻ سان هڪ ريموٽ ڪنٽرول ڏئي رهيا آهيون، جنهن کي خبر ناهي ته چينل ڪيئن بدلجي. هن نقطي تي، بٽڻ کي دٻايو جيترو توهان چاهيو، ڪجھ به ڪم نه ڪندو. ريموٽ ڪنٽرول پاڻ چينلن کي تبديل نٿو ڪري: اهو صرف ٽي وي کي سگنل ڏئي ٿو، جنهن جي اندر چينل کي تبديل ڪرڻ جو هڪ پيچيده عمل لاڳو ٿئي ٿو. تنهنڪري اهو اسان جي بتھ سان آهي: اهو لازمي طور تي ترڻ جي قابل هوندو ته جيئن ان کي انٽرفيس استعمال ڪندي رسائي سگهجي . جيڪڏهن هوء خبر ناهي ته اهو ڪيئن ڪجي، انٽرفيس ٻنهي پاسن کي ڳنڍي نه سگهندو - شخص ۽ پروگرام. هڪ شخص پروگرام فلوٽ اندر هڪ اعتراض ٺاهڻ لاء هڪ طريقو استعمال ڪرڻ جي قابل نه ٿيندو . هاڻي توهان وڌيڪ واضح طور تي ڏٺو آهي ته ڇا انٽرفيس لاء آهن. هڪ انٽرفيس اهو رويو بيان ڪري ٿو جيڪو طبقن کي لاڳو ڪري ٿو جيڪو انٽرفيس کي لازمي هجي. "رويي" طريقن جو مجموعو آهي. جيڪڏهن اسان هڪ کان وڌيڪ ميسينجر ٺاهڻ چاهيون ٿا، ته اهو ڪرڻ جو آسان طريقو آهي هڪ انٽرفيس ٺاهڻ . ڪنهن به رسول کي ڇا ڪرڻ گهرجي؟ هڪ آسان فارم ۾، پيغام وصول ڪريو ۽ موڪليو. Swimmableimplementspublic class Duck implements SwimmableDuckSwimmableDuckSwimmableswim()public class Duck implements Swimmableswim()DuckSwimmableSwimmableswim()DuckMessenger
public interface Messenger{

     public void sendMessage();

     public void getMessage();
}
۽ ھاڻي اسان صرف ھن انٽرفيس کي لاڳو ڪري پنھنجي ميسينجر ڪلاسز ٺاھي سگھون ٿا. مرتب ڪندڙ پاڻ اسان کي ”مجبور“ ڪندو ته انهن کي ڪلاسن اندر لاڳو ڪرڻ لاءِ. ٽيليگرام:
public class Telegram implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a message to Telegram!");
    }

     public void getMessage() {
         System.out.println("Reading the message in Telegram!");
     }
}
WhatsApp:
public class WhatsApp implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a WhatsApp message!");
    }

     public void getMessage() {
         System.out.println("Reading a WhatsApp message!");
     }
}
وائبر:
public class Viber implements Messenger {

    public void sendMessage() {

        System.out.println("Sending a message to Viber!");
    }

     public void getMessage() {
         System.out.println("Reading a message in Viber!");
     }
}
هي ڪهڙو فائدو ڏئي ٿو؟ انهن مان سڀ کان اهم - لوز coupling. تصور ڪريو ته اسان هڪ پروگرام ٺاهي رهيا آهيون جنهن ۾ اسان ڪسٽمر ڊيٽا گڏ ڪنداسين. ڪلاس ۾ Clientلازمي طور تي هڪ فيلڊ هجڻ گهرجي جنهن ۾ اشارو ڪيو وڃي ته ڪلائنٽ ڪهڙو ميسينجر استعمال ڪري ٿو. انٽرفيس کان سواءِ اهو عجيب لڳندو:
public class Client {

    private WhatsApp whatsApp;
    private Telegram telegram;
    private Viber viber;
}
اسان ٽي فيلڊ ٺاهيا، پر هڪ ڪلائنٽ آساني سان صرف هڪ ميسينجر رکي سگهي ٿو. اسان کي صرف خبر ناهي ته ڪهڙو. ۽ ڪلائنٽ سان رابطي کان سواء نه ڇڏڻ لاء، توهان کي ڪلاس ۾ سڀني ممڪن اختيارن کي "پش" ڪرڻو پوندو. اهو ظاهر ٿئي ٿو ته انهن مان هڪ يا ٻه هميشه هوندا null، ۽ انهن کي ڪم ڪرڻ لاء پروگرام جي ضرورت ناهي. ان جي بدران، اسان جو انٽرفيس استعمال ڪرڻ بهتر آهي:
public class Client {

    private Messenger messenger;
}
هي آهي ”لوز ڪپلنگ“ جو مثال! ڪلاس ۾ هڪ مخصوص ميسينجر ڪلاس جي وضاحت ڪرڻ بدران Client، اسان صرف اهو ذڪر ڪريون ٿا ته ڪلائنٽ وٽ هڪ ميسينجر آهي. جنهن جو تعين پروگرام دوران ڪيو ويندو. پر اسان کي ان لاءِ انٽرفيس جي ضرورت ڇو آهي؟ انهن کي زبان ۾ ڇو شامل ڪيو ويو؟ سوال سٺو ۽ صحيح آهي! ساڳيو نتيجو حاصل ڪري سگهجي ٿو عام وراثت استعمال ڪندي، صحيح؟ طبقو Messengerوالدين طبقو آهي، ۽ Viber، Telegram۽ WhatsAppوارث آهن. درحقيقت، ائين ڪرڻ ممڪن آهي. پر اتي هڪ پڪڙي آهي. جيئن ته توهان اڳ ۾ ئي ڄاڻو ٿا، جاوا ۾ ڪو به گهڻائي وراثت نه آهي. پر انٽرفيس جا ڪيترائي نفاذ آھن. ھڪڙو طبقو ڪيترن ئي انٽرفيس کي لاڳو ڪري سگھي ٿو جيترو اھو پسند ڪندو. تصور ڪريو ته اسان وٽ ھڪڙو طبقو آھي Smartphoneجنھن ۾ ھڪڙو فيلڊ آھي Application- ھڪڙي ايپليڪيشن سمارٽ فون تي نصب ٿيل آھي.
public class Smartphone {

    private Application application;
}
اپليڪيشن ۽ ميسينجر، يقينا، هڪجهڙا آهن، پر تڏهن به اهي مختلف شيون آهن. ميسينجر موبائل ۽ ڊيسڪ ٽاپ ٻئي ٿي سگهي ٿو، جڏهن ته ايپليڪيشن هڪ موبائل ايپليڪيشن آهي. Telegramتنهن ڪري، جيڪڏهن اسان وراثت استعمال ڪندا آهيون، اسان طبقي ۾ اعتراض شامل ڪرڻ جي قابل نه هوندا Smartphone. آخرڪار، هڪ طبقو Telegramوارث نه ٿي سگهي ٿو Application۽ ان کان Messenger! ۽ اسان اڳ ۾ ئي ان کي ورثي ۾ حاصل ڪرڻ ۾ ڪامياب ٿي چڪا آهيون Messenger، ۽ ان کي هن فارم ۾ ڪلاس ۾ شامل ڪيو Client. پر هڪ طبقو Telegramآساني سان ٻنهي انٽرفيس کي لاڳو ڪري سگهي ٿو! تنهن ڪري، هڪ طبقي ۾ Clientاسان هڪ اعتراض کي لاڳو ڪري سگهون ٿا Telegram، Messenger۽ هڪ طبقي Smartphone۾ Application. هتي اهو ڪيئن ڪيو ويو آهي:
public class Telegram implements Application, Messenger {

    //...methods
}

public class Client {

    private Messenger messenger;

    public Client() {
        this.messenger = new Telegram();
    }
}


public class Smartphone {

    private Application application;

    public Smartphone() {
        this.application = new Telegram();
    }
}
هاڻي اسان ڪلاس استعمال ڪري سگهون ٿا Telegramجيئن اسان چاهيو. ڪٿي هو جي ڪردار ۾ ڪم ڪندو Applicationته ڪٿي جي ڪردار ۾ Messenger. توھان شايد اڳ ۾ ئي محسوس ڪيو آھي ته انٽرفيس ۾ طريقا ھميشه "خالي" آھن، اھو آھي، انھن تي عمل درآمد نه آھي. هن جو سبب سادو آهي: هڪ انٽرفيس رويي کي بيان ڪري ٿو، نه ان کي لاڳو ڪري ٿو. "طبقن جون سڀئي شيون جيڪي انٽرفيس کي لاڳو ڪن ٿيون، Swimmableلازمي طور تي فلوٽ ٿيڻ جي قابل": اهو سڀ انٽرفيس اسان کي ٻڌائي ٿو. هڪ مڇي، بتھ يا گهوڙو ڪيئن ترندو اتي اهو سوال آهي ڪلاسن لاءِ Fish، Duck۽ Horse، ۽ نه انٽرفيس لاءِ. جيئن چينل تبديل ڪرڻ ٽي وي جو ڪم آهي. ريموٽ صرف توهان کي اهو ڪرڻ لاءِ هڪ بٽڻ ڏئي ٿو. بهرحال، Java8 ۾ هڪ دلچسپ اضافو آهي - ڊفالٽ طريقا. مثال طور، توهان جي انٽرفيس ۾ 10 طريقا آهن. انهن مان 9 مختلف طبقن ۾ مختلف طريقي سان لاڳو ڪيا ويا آهن، پر سڀني ۾ هڪ ئي لاڳو ٿئي ٿو. اڳي، جاوا 8 جي ڇڏڻ کان اڳ، انٽرفيس اندر طريقن تي عمل درآمد نه ڪيو ويو: گڏ ڪندڙ فوري طور تي هڪ غلطي اڇلائي. هاڻي توهان هن طرح ڪري سگهو ٿا:
public interface Swimmable {

   public default void swim() {
       System.out.println("Swim!");
   }

   public void eat();

   public void run();
}
لفظ استعمال ڪندي default، اسان انٽرفيس ۾ ڊفالٽ لاڳو ڪرڻ سان ھڪڙو طريقو ٺاھيو آھي. اسان کي ٻين ٻن طريقن کي لاڳو ڪرڻ جي ضرورت پوندي، eat()۽ run()پاڻ کي سڀني طبقن ۾ لاڳو ڪرڻ جي ضرورت پوندي Swimmable. هن طريقي سان ائين ڪرڻ جي ڪا ضرورت ناهي swim(): عمل درآمد سڀني طبقن ۾ ساڳيو هوندو. رستي ۾، توهان ماضي جي ڪمن ۾ هڪ کان وڌيڪ ڀيرا انٽرفيس ۾ آيا آهيو، جيتوڻيڪ توهان پاڻ ان کي نوٽيس نه ڪيو :) هتي هڪ واضح مثال آهي: اسان کي جاوا ۾ انٽرنيٽ جي ضرورت ڇو آهي - 2توهان انٽرفيس سان ڪم ڪيو List۽ Set! وڌيڪ واضح طور تي، انهن جي عملن سان - ArrayList, LinkedList, HashSet۽ ٻيا. ساڳيو ڊراگرام هڪ مثال ڏيکاري ٿو جڏهن هڪ طبقو ڪيترن ئي انٽرفيس کي هڪ ڀيرو لاڳو ڪري ٿو. مثال طور، LinkedListاهو انٽرفيس List۽ Deque(ڊبل رخا قطار) کي لاڳو ڪري ٿو. توهان انٽرفيس سان پڻ واقف آهيو Map، يا بلڪه، ان جي عملن سان - HashMap. رستي ۾، هن آريگرام ۾ توهان هڪ خاصيت ڏسي سگهو ٿا: انٽرفيس هڪ ٻئي کان ورثي ۾ ٿي سگهي ٿو. انٽرفيس SortedMapکان ورثي ۾ ملي ٿو Map، ۽ Dequeقطار مان ورثي ۾ ملي ٿو Queue. اهو ضروري آهي جيڪڏهن توهان انٽرفيس جي وچ ۾ ڪنيڪشن ڏيکارڻ چاهيو ٿا، پر هڪ انٽرفيس ٻئي جو وڌايل نسخو آهي. اچو ته هڪ مثال ڏسو هڪ انٽرفيس سان Queue- هڪ قطار. اسان اڃا تائين مجموعن جي ذريعي نه ويا آهيون Queue، پر اهي بلڪل سادو آهن ۽ هڪ اسٽور ۾ باقاعده لائن وانگر ترتيب ڏنل آهن. توھان عناصر شامل ڪري سگھوٿا صرف قطار جي آخر ۾، ۽ انھن کي صرف شروعات کان وٺي وٺو. هڪ خاص اسٽيج تي، ڊولپرز کي قطار جي وڌايل ورزن جي ضرورت هئي ته جيئن عناصر شامل ڪري سگهجن ۽ ٻنهي طرفن کان وصول ڪيا وڃن. هي ڪيئن هڪ انٽرفيس پيدا ڪيو ويو Deque- هڪ ٻه طرفي قطار. اهو هڪ باقاعده قطار جي سڀني طريقن تي مشتمل آهي، ڇاڪاڻ ته اها ٻه طرفي قطار جي "والدين" آهي، پر نوان طريقا شامل ڪيا ويا آهن.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION