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

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

گروپ میں شائع ہوا۔
OOP سے متعلقہ سوالات آئی ٹی کمپنی میں جاوا ڈویلپر کی پوزیشن کے لیے تکنیکی انٹرویو کا ایک لازمی حصہ ہیں۔ اس مضمون میں، ہم OOP کے ایک اصول کے بارے میں بات کریں گے - پولیمورفزم۔ ہم ان پہلوؤں پر توجہ مرکوز کریں گے جن کے بارے میں انٹرویو کے دوران اکثر پوچھا جاتا ہے، اور وضاحت کے لیے چند مثالیں بھی دیں گے۔

جاوا میں پولیمورفزم کیا ہے؟

پولیمورفزم ایک پروگرام کی قابلیت ہے کہ اشیاء کی مخصوص قسم کے بارے میں معلومات کے بغیر، ایک ہی انٹرفیس کے ساتھ ایک ہی طریقے سے اشیاء کا علاج کرے۔ اگر آپ اس سوال کا جواب دیتے ہیں کہ پولیمورفزم کیا ہے، تو آپ سے غالباً کہا جائے گا کہ آپ کا مطلب کیا ہے۔ اضافی سوالات کے ایک گروپ کو متحرک کیے بغیر، یہ سب کچھ انٹرویو لینے والے کے لیے ایک بار پھر پیش کریں۔ انٹرویو کا وقت: جاوا میں پولیمورفزم - 1آپ اس حقیقت کے ساتھ شروع کر سکتے ہیں کہ OOP اپروچ میں اشیاء کے درمیان تعامل کی بنیاد پر جاوا پروگرام بنانا شامل ہے، جو کہ کلاسز پر مبنی ہیں۔ کلاسز پہلے لکھے ہوئے بلیو پرنٹس (ٹیمپلیٹس) ہیں جو پروگرام میں اشیاء بنانے کے لیے استعمال ہوتے ہیں۔ مزید برآں، کلاس میں ہمیشہ ایک مخصوص قسم ہوتی ہے، جو کہ اچھے پروگرامنگ اسٹائل کے ساتھ، ایک نام رکھتا ہے جو اس کا مقصد بتاتا ہے۔ مزید، یہ نوٹ کیا جا سکتا ہے کہ چونکہ جاوا سختی سے ٹائپ کیا جاتا ہے، پروگرام کوڈ کو ہمیشہ ایک آبجیکٹ کی قسم کی وضاحت کرنی چاہیے جب متغیرات کا اعلان کیا جائے۔ اس میں اس حقیقت کو شامل کریں کہ سخت ٹائپنگ کوڈ کی حفاظت اور وشوسنییتا کو بہتر بناتی ہے، اور یہ ممکن بناتی ہے، یہاں تک کہ تالیف کے وقت بھی، غیر مطابقت کی اقسام کی وجہ سے ہونے والی غلطیوں کو روکنا (مثال کے طور پر، کسی تار کو نمبر سے تقسیم کرنے کی کوشش)۔ فطری طور پر، مرتب کرنے والے کو اعلان کردہ قسم کو "جاننا" چاہیے - یہ 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);
سپر کلاس کے متغیر کا اعلان کریں اور اسے ایک ایسی چیز تفویض کریں جو اس کی اولاد میں سے ایک کی مثال ہو۔ آپ سے غالباً پوچھا جائے گا کہ کمپائلر اسائنمنٹ آپریٹر کے بائیں اور دائیں جانب اعلان کردہ اقسام کی عدم مطابقت پر کیوں نہیں پلٹتا ہے - بہر حال، جاوا سختی سے ٹائپ کیا گیا ہے۔ وضاحت کریں کہ ایک وسیع کرنے والی قسم کی تبدیلی یہاں کام کر رہی ہے — کسی چیز کے حوالہ کو اس کی بنیادی کلاس کے حوالہ کی طرح سمجھا جاتا ہے۔ مزید یہ کہ کوڈ میں اس طرح کی تعمیر کا سامنا کرنے کے بعد، مرتب کنورژن کو خود بخود اور واضح طور پر انجام دیتا ہے۔ نمونہ کوڈ ظاہر کرتا ہے کہ اسائنمنٹ آپریٹر کے بائیں جانب اعلان کردہ قسم ( Dancer ) کی متعدد شکلیں (قسم) ہیں، جن کا اعلان دائیں جانب کیا گیا ہے ( Breakdancer , ElectricBoogieDancer )۔ سپرکلاس ( رقص کا طریقہ) میں بیان کردہ عمومی فعالیت کے حوالے سے ہر فارم کا اپنا منفرد طرز عمل ہو سکتا ہے۔ یعنی، سپر کلاس میں اعلان کردہ طریقہ اس کی اولاد میں مختلف طریقے سے لاگو کیا جا سکتا ہے۔ اس معاملے میں، ہم طریقہ کار سے نمٹ رہے ہیں، جو بالکل وہی ہے جو متعدد شکلیں (رویے) پیدا کرتا ہے۔ یہ کوڈ کو مین طریقہ میں چلا کر دیکھا جا سکتا ہے: پروگرام آؤٹ پٹ: میں فریڈ ہوں۔ میری عمر 18 سال ہے۔ میں سب کی طرح ڈانس کرتا ہوں۔ میں جے ہوں۔ میں 19 سال کا ہوں. میں بریک ڈانس! میں مارسیا ہوں۔ میری عمر 20 سال ہے۔ میں الیکٹرک بوگی ڈانس کرتا ہوں! اگر ہم ذیلی طبقات میں طریقہ کو اوور رائڈ نہیں کرتے ہیں، تو ہمیں مختلف رویہ نہیں ملے گا۔ مثال کے طور پر، اگر ہم اپنی بریک ڈانسر اور الیکٹرک بوگی ڈانسر کلاسز میں ڈانس کے طریقہ کار پر تبصرہ کرتے ہیں ، تو پروگرام کا آؤٹ پٹ یہ ہوگا: میں فریڈ ہوں۔ میری عمر 18 سال ہے۔ میں سب کی طرح ڈانس کرتا ہوں۔ میں جے ہوں۔ میں 19 سال کا ہوں. میں سب کی طرح ڈانس کرتا ہوں۔ میں مارسیا ہوں۔ میری عمر 20 سال ہے۔ میں سب کی طرح ڈانس کرتا ہوں۔ اور اس کا مطلب یہ ہے کہ بریک ڈانسر اور الیکٹرک بوگی ڈانسر کلاسز بنانا کوئی معنی نہیں رکھتا ۔ پولیمورفزم کا اصول خاص طور پر کہاں ظاہر ہوتا ہے؟ پروگرام میں کسی چیز کو اس کی مخصوص قسم کے علم کے بغیر کہاں استعمال کیا جاتا ہے؟ ہماری مثال میں، ایسا اس وقت ہوتا ہے جب ڈانسر ڈی آبجیکٹ پر ڈانس() طریقہ کو بلایا جاتا ہے ۔ جاوا میں، پولیمورفزم کا مطلب ہے کہ پروگرام کو یہ جاننے کی ضرورت نہیں ہے کہ آیا یہ چیز 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");
    }
}
بعض اوقات انٹرویو لینے والے اس بارے میں پوچھتے ہیں کہ کس طرح بیس کلاسز میں طریقوں کا اعلان کیا جانا چاہیے تاکہ پولیمورفزم کے اصول کی خلاف ورزی نہ ہو۔ جواب آسان ہے: یہ طریقے جامد ، نجی یا حتمی نہیں ہونے چاہئیں ۔ پرائیویٹ ایک طریقہ کو صرف ایک کلاس میں دستیاب کرتا ہے، لہذا آپ اسے ذیلی طبقے میں اوور رائڈ نہیں کر سکیں گے۔ جامد کسی بھی شے کے بجائے ایک طریقہ کو کلاس کے ساتھ جوڑتا ہے، لہذا سپر کلاس کا طریقہ ہمیشہ کہا جائے گا۔ اور فائنل ایک طریقہ کو ناقابل تغیر اور ذیلی طبقات سے پوشیدہ بناتا ہے۔

پولیمورفزم ہمیں کیا دیتا ہے؟

آپ سے یہ بھی پوچھا جائے گا کہ پولیمورفزم ہمیں کس طرح فائدہ دیتا ہے۔ آپ بالوں والی تفصیلات میں الجھے بغیر اس کا مختصر جواب دے سکتے ہیں:
  1. یہ کلاس کے نفاذ کو تبدیل کرنا ممکن بناتا ہے۔ اس پر ٹیسٹنگ بنائی گئی ہے۔
  2. یہ توسیع پذیری کی سہولت فراہم کرتا ہے، جس سے ایسی بنیاد بنانا بہت آسان ہو جاتا ہے جس پر مستقبل میں تعمیر کیا جا سکے۔ موجودہ قسم کی بنیاد پر نئی اقسام کو شامل کرنا OOP پروگراموں کی فعالیت کو بڑھانے کا سب سے عام طریقہ ہے۔
  3. یہ آپ کو ایسی اشیاء کو یکجا کرنے دیتا ہے جو ایک عام قسم یا طرز عمل کو ایک مجموعہ یا صف میں بانٹتے ہیں اور انہیں یکساں طور پر ہینڈل کرتے ہیں (جیسا کہ ہماری مثالوں میں، جہاں ہم نے سب کو ناچنے پر مجبور کیا() یا تیراکی () :)
  4. نئی قسمیں بنانے میں لچک: آپ والدین کے طریقہ کار کے نفاذ کا انتخاب کرسکتے ہیں یا اسے ذیلی طبقے میں اوور رائڈ کرسکتے ہیں۔

کچھ جدائی کے الفاظ

پولیمورفزم ایک بہت اہم اور وسیع موضوع ہے۔ یہ جاوا میں OOP پر اس مضمون کے تقریباً نصف کا موضوع ہے اور زبان کی بنیاد کا ایک اچھا حصہ بناتا ہے۔ آپ انٹرویو میں اس اصول کی وضاحت کرنے سے گریز نہیں کر پائیں گے۔ اگر آپ اسے نہیں جانتے یا نہیں سمجھتے ہیں تو، انٹرویو شاید ختم ہو جائے گا. اس لیے سستی نہ کریں — انٹرویو سے پہلے اپنے علم کا اندازہ لگائیں اور اگر ضروری ہو تو اسے تازہ کریں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION