JavaRush /جاوا بلاگ /Random-UR /جاوا میں انٹرفیس

جاوا میں انٹرفیس

گروپ میں شائع ہوا۔
ہیلو! آج ہم جاوا میں ایک اہم تصور کے بارے میں بات کریں گے - انٹرفیس۔ یہ لفظ شاید آپ سے واقف ہے۔ مثال کے طور پر، زیادہ تر کمپیوٹر پروگراموں اور گیمز میں انٹرفیس ہوتے ہیں۔ ایک وسیع معنوں میں، ایک انٹرفیس ایک قسم کا "ریموٹ کنٹرول" ہے جو دو فریقوں کو ایک دوسرے سے جوڑتا ہے۔ روزمرہ کی زندگی سے انٹرفیس کی ایک سادہ مثال ٹی وی ریموٹ کنٹرول ہے۔ یہ دو اشیاء، ایک شخص اور ایک ٹی وی کو جوڑتا ہے، اور مختلف کام انجام دیتا ہے: والیوم کو اوپر یا نیچے کرنا، چینل تبدیل کرنا، ٹی وی کو آن یا آف کرنا۔ ایک طرف (شخص) کو انٹرفیس تک رسائی حاصل کرنے کی ضرورت ہے (ریموٹ کنٹرول بٹن دبائیں) دوسری طرف کارروائی کرنے کے لیے۔ مثال کے طور پر، ٹی وی کے لیے چینل کو اگلے ایک پر سوئچ کرنا۔ اس صورت میں، صارف کو یہ جاننے کی ضرورت نہیں ہے کہ ٹی وی کی ڈیوائس کیا ہے اور اس کے اندر چینل کو تبدیل کرنے کا عمل کیسے لاگو ہوتا ہے۔ جاوا میں انٹرفیس کی ضرورت کیوں ہے - 1تمام صارف کو انٹرفیس تک رسائی حاصل ہے ۔ اہم کام مطلوبہ نتیجہ حاصل کرنا ہے۔ اس کا پروگرامنگ اور جاوا سے کیا تعلق ہے؟ Direct :) انٹرفیس بنانا ایک باقاعدہ کلاس بنانے کے مترادف ہے، لیکن اس لفظ کے بجائے classہم لفظ کی وضاحت کرتے ہیں interface۔ آئیے سادہ ترین جاوا انٹرفیس کو دیکھیں اور معلوم کریں کہ یہ کیسے کام کرتا ہے اور اس کی کیا ضرورت ہے:
public interface Swimmable  {

     public void swim();
}
ہم نے ایک انٹرفیس بنایا ہے Swimmableجو تیر سکتا ہے ۔ یہ ہمارے ریموٹ کنٹرول کی طرح ہے، جس میں ایک "بٹن" ہے: طریقہ swim() "تیرنا" ہے۔ ہم اس " ریموٹ کنٹرول " کو کیسے استعمال کر سکتے ہیں؟ اس مقصد کے لیے طریقہ، یعنی ہمارے ریموٹ کنٹرول پر بٹن کو لاگو کرنے کی ضرورت ہے۔ انٹرفیس کو استعمال کرنے کے لیے، اس کے طریقوں کو ہمارے پروگرام کی کچھ کلاسوں کے ذریعے لاگو کیا جانا چاہیے۔ آئیے ایک ایسی کلاس کے ساتھ آتے ہیں جس کی اشیاء "تیر کر سکتے ہیں" کی وضاحت کے مطابق ہوں۔ مثال کے طور پر، بطخ کی کلاس موزوں ہے 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ایک انٹرفیس کے ساتھ منسلک ہوتا ہے ۔ اگر آپ کو یاد ہے، ہم نے وراثت میں دو طبقوں کو جوڑنے کے لیے اسی طرح کا طریقہ کار استعمال کیا، صرف لفظ " extensions " تھا۔ وضاحت کے لیے لفظی ترجمہ کیا جا سکتا ہے: "ایک عوامی طبقہ انٹرفیس کو نافذ کرتا ہے ۔" اس کا مطلب یہ ہے کہ انٹرفیس سے وابستہ کلاس کو اپنے تمام طریقوں کو نافذ کرنا ہوگا۔ براہ کرم نوٹ کریں: ہماری کلاس میں، بالکل اسی طرح جیسے انٹرفیس میں ، ایک طریقہ ہے ، اور اس کے اندر ایک قسم کی منطق ہے۔ یہ ایک لازمی شرط ہے۔ اگر ہم نے صرف "" لکھا اور کلاس میں کوئی طریقہ نہیں بنایا تو کمپائلر ہمیں ایک غلطی دے گا: بتھ خلاصہ نہیں ہے اور سوئم ایبل میں خلاصہ طریقہ swim() کو اوور رائڈ نہیں کرتا ہے ایسا کیوں ہوتا ہے؟ اگر ہم ٹی وی کی مثال استعمال کرتے ہوئے غلطی کی وضاحت کرتے ہیں، تو پتہ چلتا ہے کہ ہم ایک ایسے شخص کو ٹی وی سے "چینل تبدیل کریں" بٹن کے ساتھ ریموٹ کنٹرول دے رہے ہیں جو چینلز کو تبدیل کرنے کا طریقہ نہیں جانتا ہے۔ اس مقام پر جتنا چاہیں بٹن دبائیں، کچھ نہیں چلے گا۔ ریموٹ کنٹرول خود چینلز کو تبدیل نہیں کرتا: یہ صرف ٹی وی کو سگنل دیتا ہے، جس کے اندر چینل کو تبدیل کرنے کا ایک پیچیدہ عمل لاگو ہوتا ہے۔ تو یہ ہماری بطخ کے ساتھ ہے: اسے تیرنے کے قابل ہونا چاہیے تاکہ انٹرفیس کے ذریعے اس تک رسائی حاصل کی جا سکے ۔ اگر وہ نہیں جانتی ہے کہ یہ کیسے کرنا ہے، تو انٹرفیس دونوں اطراف - شخص اور پروگرام کو جوڑ نہیں پائے گا۔ ایک شخص پروگرام فلوٹ کے اندر کسی چیز کو بنانے کا طریقہ استعمال نہیں کر سکے گا ۔ اب آپ نے زیادہ واضح طور پر دیکھا ہے کہ انٹرفیس کس کے لیے ہیں۔ ایک انٹرفیس اس طرز عمل کی وضاحت کرتا ہے جو اس انٹرفیس کو نافذ کرنے والی کلاسوں کا ہونا ضروری ہے۔ "رویہ" طریقوں کا مجموعہ ہے۔ اگر ہم ایک سے زیادہ میسنجر بنانا چاہتے ہیں تو ایسا کرنے کا سب سے آسان طریقہ ایک انٹرفیس بنانا ہے ۔ کسی بھی رسول کو کیا کرنا چاہیے؟ ایک آسان شکل میں، پیغامات وصول کریں اور بھیجیں۔ 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!");
     }
}
واٹس ایپ:
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!");
     }
}
یہ کیا فوائد فراہم کرتا ہے؟ ان میں سب سے اہم ڈھیلا جوڑا ہے۔ تصور کریں کہ ہم ایک پروگرام ڈیزائن کر رہے ہیں جس میں ہم صارفین کا ڈیٹا اکٹھا کریں گے۔ کلاس میں 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میراث نہیں مل سکتا ! اور ہم پہلے ہی اسے وراثت میں حاصل کرنے میں کامیاب ہو چکے ہیں ، اور اسے اس فارم میں کلاس میں شامل کر چکے ہیں ۔ لیکن ایک کلاس دونوں انٹرفیس کو آسانی سے نافذ کر سکتی ہے! لہذا، ایک کلاس میں ہم کسی چیز کو بطور اور ایک کلاس میں لاگو کر سکتے ہیں ۔ یہاں یہ ہے کہ یہ کیسے ہوتا ہے: ApplicationMessengerMessengerClientTelegramClientTelegramMessengerSmartphoneApplication
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 کو مختلف کلاسوں میں مختلف طریقے سے لاگو کیا جاتا ہے، لیکن ایک کو سبھی میں ایک جیسا نافذ کیا جاتا ہے۔ اس سے پہلے، Java8 کی ریلیز سے پہلے، انٹرفیس کے اندر کے طریقوں پر کوئی عمل درآمد نہیں ہوتا تھا: مرتب کرنے والے نے فوری طور پر ایک غلطی پھینک دی۔ اب آپ اسے اس طرح کر سکتے ہیں:
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اور دیگر۔ ایک ہی خاکہ ایک مثال دکھاتا ہے جب ایک کلاس ایک ساتھ کئی انٹرفیس کو نافذ کرتی ہے۔ مثال کے طور پر، یہ انٹرفیس اور (ڈبل رخا قطار) کو نافذ کرتا ہے۔ آپ انٹرفیس سے بھی واقف ہیں ، یا اس کے نفاذ سے - ۔ ویسے، اس خاکہ میں آپ ایک خصوصیت دیکھ سکتے ہیں: انٹرفیس ایک دوسرے سے وراثت میں مل سکتے ہیں۔ انٹرفیس سے وراثت میں ملا ہے ، اور قطار سے وراثت میں ملا ہے ۔ اگر آپ انٹرفیس کے درمیان کنکشن دکھانا چاہتے ہیں تو یہ ضروری ہے، لیکن ایک انٹرفیس دوسرے کا توسیعی ورژن ہے۔ آئیے ایک انٹرفیس کے ساتھ ایک مثال دیکھیں - ایک قطار۔ ہم ابھی تک مجموعوں سے نہیں گزرے ہیں ، لیکن وہ کافی آسان ہیں اور اسٹور میں ایک باقاعدہ لائن کی طرح ترتیب دیے گئے ہیں۔ آپ عناصر کو صرف قطار کے آخر میں شامل کر سکتے ہیں، اور انہیں صرف شروع سے ہی لے جا سکتے ہیں۔ ایک خاص مرحلے پر، ڈویلپرز کو قطار کے ایک توسیعی ورژن کی ضرورت تھی تاکہ عناصر کو شامل کیا جا سکے اور دونوں طرف سے وصول کیا جا سکے۔ اس طرح ایک انٹرفیس بنایا گیا تھا - ایک دو طرفہ قطار۔ اس میں باقاعدہ قطار کے تمام طریقے شامل ہیں، کیونکہ یہ دو طرفہ قطار کا "والدین" ہے، لیکن نئے طریقے شامل کیے گئے ہیں۔ LinkedListHashSetLinkedListListDequeMapHashMapSortedMapMapDequeQueueQueueQueueDeque
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION