JavaRush /جاوا بلاگ /Random-UR /جاوا میں پولیمورفزم

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

گروپ میں شائع ہوا۔
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 "Я " + name + ", to me " + age + " years. " ;
    }
}
اولاد میں، بیس کلاس طریقہ کو اوور رائیڈ کریں:
public class ElectricBoogieDancer extends Dancer {
    public ElectricBoogieDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance() {
        System.out.println( toString() + "I dance electric boogie!");
    }
}

public class BreakDankDancer extends Dancer{

    public BreakDankDancer(String name, int age) {
        super(name, age);
    }
// overriding the base class method
    @Override
    public void dance(){
        System.out.println(toString() + "I'm breakdancing!");
    }
}
جاوا میں پولیمورفزم کی ایک مثال اور پروگرام میں اشیاء کا استعمال:
public class Main {

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

        Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);// upcast to base type
        Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20); // upcast to base type

        List<Dancer> discotheque = Arrays.asList(dancer, breakDanceDancer, electricBoogieDancer);
        for (Dancer d : discotheque) {
            d.dance();// polymorphic method call
        }
    }
}
طریقہ کار کوڈ میں mainدکھائیں کہ لائنوں میں کیا ہے:
Dancer breakDanceDancer = new BreakDankDancer("Alexei", 19);
Dancer electricBoogieDancer = new ElectricBoogieDancer("Igor", 20);
ہم نے ایک سپر کلاس قسم کے متغیر کا اعلان کیا اور اسے اولاد میں سے ایک کی قدر تفویض کی۔ غالباً، آپ سے پوچھا جائے گا کہ کمپائلر اسائنمنٹ سائن کے بائیں اور دائیں طرف اعلان کردہ اقسام کے درمیان مماثلت کی شکایت کیوں نہیں کرے گا، کیونکہ جاوا میں ٹائپنگ سخت ہے۔ وضاحت کریں کہ اوپر کی قسم کی تبدیلی یہاں کام کرتی ہے - کسی چیز کے حوالہ کو بیس کلاس کے حوالہ سے تعبیر کیا جاتا ہے۔ مزید یہ کہ، مرتب کرنے والا، کوڈ میں ایسی تعمیر کا سامنا کرنے کے بعد، یہ خود بخود اور واضح طور پر کرتا ہے۔ مثال کے کوڈ کی بنیاد پر، یہ دکھایا جا سکتا ہے کہ اسائنمنٹ سائن کے بائیں طرف اعلان کردہ کلاس کی قسم کے دائیں Dancerطرف اعلان کردہ کئی شکلیں (قسم) ہیں BreakDankDancer۔ ElectricBoogieDancerسپرکلاس طریقہ میں بیان کردہ مشترکہ فعالیت کے لیے ہر ایک فارم کا اپنا منفرد طرز عمل ہو سکتا ہے dance۔ یعنی سپر کلاس میں اعلان کردہ طریقہ اس کی اولاد میں مختلف طریقے سے لاگو کیا جا سکتا ہے۔ اس معاملے میں، ہم طریقہ کار سے نمٹ رہے ہیں، اور یہ بالکل وہی ہے جو مختلف شکلوں (رویے) کو تخلیق کرتا ہے۔ آپ اسے عمل درآمد کے لیے مین میتھڈ کوڈ چلا کر دیکھ سکتے ہیں: پروگرام آؤٹ پٹ میں انتون ہوں، میری عمر 18 سال ہے۔ میں سب کی طرح ڈانس کرتا ہوں۔ میں الیکسی ہوں، میری عمر 19 سال ہے۔ میں بریک ڈانس! میں اگور ہوں، میری عمر 20 سال ہے۔ میں الیکٹرک بوگی ڈانس کرتا ہوں! اگر ہم اولاد میں اوور رائڈنگ کا استعمال نہیں کریں گے تو ہمیں مختلف رویہ نہیں ملے گا۔ BreakDankDancerمثال کے طور پر، اگر ہم اپنی کلاسز کے ElectricBoogieDancerطریقہ کار پر تبصرہ کرتے ہیں dance، تو پروگرام کا آؤٹ پٹ اس طرح ہوگا: میں Anton ہوں، میری عمر 18 سال ہے۔ میں سب کی طرح ڈانس کرتا ہوں۔ میں الیکسی ہوں، میری عمر 19 سال ہے۔ میں سب کی طرح ڈانس کرتا ہوں۔ میں اگور ہوں، میری عمر 20 سال ہے۔ میں سب کی طرح ڈانس کرتا ہوں۔ BreakDankDancerاور اس کا مطلب ہے کہ نئی کلاسیں بنانے کا کوئی فائدہ نہیں ہے ElectricBoogieDancer۔ جاوا پولیمورفزم کا اصول کیا ہے؟ کسی پروگرام میں کسی چیز کو اس کی مخصوص قسم جانے بغیر استعمال کرنا کہاں پوشیدہ ہے؟ ہماری مثال میں، یہ قسم کی d.dance()کسی چیز پر کال کرنے کا طریقہ ہے ۔ جاوا پولیمورفزم کا مطلب ہے کہ پروگرام کو یہ جاننے کی ضرورت نہیں ہے کہ آبجیکٹ یا آبجیکٹ کس قسم کا ہوگا ۔ اصل بات یہ ہے کہ یہ کلاس کی اولاد ہے ۔ اور اگر ہم اولاد کے بارے میں بات کرتے ہیں، تو یہ یاد رکھنا چاہیے کہ جاوا میں وراثت نہ صرف ہے ، بلکہ . اب یہ یاد رکھنے کا وقت ہے کہ جاوا متعدد وراثت کی حمایت نہیں کرتا ہے - ہر قسم میں ایک والدین (سپر کلاس) اور لامحدود تعداد میں اولاد (ذیلی طبقات) ہوسکتی ہے۔ لہذا، انٹرفیس کا استعمال کلاسوں میں ایک سے زیادہ فعالیت شامل کرنے کے لیے کیا جاتا ہے۔ انٹرفیس وراثت کے مقابلے میں والدین سے اشیاء کے جوڑے کو کم کرتے ہیں اور بہت وسیع پیمانے پر استعمال ہوتے ہیں۔ جاوا میں، ایک انٹرفیس ایک حوالہ کی قسم ہے، لہذا ایک پروگرام قسم کو انٹرفیس کی قسم کا متغیر قرار دے سکتا ہے۔ مثال دینے کا یہ اچھا وقت ہے۔ آئیے انٹرفیس بنائیں: dDancerBreakDankDancerElectricBoogieDancerDancerextendsimplements
public interface Swim {
    void swim();
}
وضاحت کے لیے، آئیے مختلف اور غیر متعلقہ اشیاء لیں اور ان میں ایک انٹرفیس نافذ کریں:
public class Human implements Swim {
    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 inflatable ring.");
    }

    @Override
    public String toString() {
        return "Я " + name + ", to me " + age + " years. ";
    }

}

public class Fish implements Swim{
    private String name;

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

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

    }

public class UBoat implements Swim {

    private int speed;

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

    @Override
    public void swim() {
        System.out.println("The submarine is sailing, rotating the propellers, at a speed" + speed + " knots.");
    }
}
طریقہ main:
public class Main {

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

        List<Swim> swimmers = Arrays.asList(human, fish, boat);
        for (Swim s : swimmers) {
            s.swim();
        }
    }
}
ایک انٹرفیس میں بیان کردہ پولیمورفک طریقہ کار کو انجام دینے کا نتیجہ ہمیں اس انٹرفیس کو نافذ کرنے والی اقسام کے طرز عمل میں فرق دیکھنے کی اجازت دیتا ہے۔ وہ طریقہ کار پر عمل درآمد کے مختلف نتائج پر مشتمل ہوتے ہیں swim۔ ہماری مثال کا مطالعہ کرنے کے بعد، انٹرویو لینے والا پوچھ سکتا ہے کہ کیوں، جب سے کوڈ کو عمل میں لاتے ہیں۔main
for (Swim s : swimmers) {
            s.swim();
}
کیا ان کلاسوں میں بیان کردہ طریقوں کو ہماری اشیاء کے لیے بلایا گیا ہے؟ کسی پروگرام پر عمل کرتے وقت آپ کسی طریقہ کے مطلوبہ نفاذ کو کیسے منتخب کرتے ہیں؟ ان سوالات کا جواب دینے کے لیے، ہمیں دیر سے (متحرک) بائنڈنگ کے بارے میں بات کرنے کی ضرورت ہے۔ بائنڈنگ سے ہمارا مطلب ہے کہ میتھڈ کال اور کلاسز میں اس کے مخصوص نفاذ کے درمیان تعلق قائم کرنا۔ بنیادی طور پر، کوڈ اس بات کا تعین کرتا ہے کہ کلاسوں میں بیان کردہ تین طریقوں میں سے کون سا عمل کیا جائے گا۔ جاوا بذریعہ ڈیفالٹ لیٹ بائنڈنگ کا استعمال کرتا ہے (کمپائل ٹائم کے بجائے رن ٹائم پر، جیسا کہ ابتدائی بائنڈنگ کا معاملہ ہے)۔ اس کا مطلب یہ ہے کہ کوڈ کو مرتب کرتے وقت
for (Swim s : swimmers) {
            s.swim();
}
مرتب کرنے والے کو ابھی تک معلوم نہیں ہے کہ کوڈ کس کلاس سے ہے Human، Fishیا آیا Uboatاس پر عمل درآمد کیا جائے گا swim۔ اس کا تعین صرف اس وقت کیا جائے گا جب پروگرام کو ڈائنامک ڈسپیچ کے طریقہ کار کی بدولت عمل میں لایا جاتا ہے - پروگرام کے عمل کے دوران آبجیکٹ کی قسم کی جانچ کرنا اور اس قسم کے طریقہ کار کے مطلوبہ نفاذ کو منتخب کرنا۔ اگر آپ سے پوچھا جائے کہ یہ کیسے لاگو ہوتا ہے، تو آپ جواب دے سکتے ہیں کہ جب اشیاء کو لوڈ اور شروع کرتے ہیں، JVM میموری میں ٹیبل بناتا ہے، اور ان میں متغیر کو ان کی اقدار کے ساتھ اور اشیاء کو ان کے طریقوں سے جوڑتا ہے۔ مزید برآں، اگر کوئی شے وراثت میں ملی ہے یا کسی انٹرفیس کو نافذ کرتی ہے، تو اس کی کلاس میں اوور رائیڈڈ طریقوں کی موجودگی کو پہلے چیک کیا جاتا ہے۔ اگر کوئی ہیں، تو وہ اس قسم سے منسلک ہیں، اگر نہیں، تو ایک طریقہ تلاش کیا جاتا ہے جس کی وضاحت کلاس ون لیول ہائی (والدین میں) اور اسی طرح ملٹی لیول کے درجہ بندی میں جڑ تک ہوتی ہے۔ OOP میں پولیمورفزم اور پروگرام کوڈ میں اس کے نفاذ کے بارے میں بات کرتے ہوئے، ہم نوٹ کرتے ہیں کہ خلاصہ کلاسوں کے ساتھ ساتھ انٹرفیس کا استعمال کرتے ہوئے بیس کلاسز کی وضاحت کے لیے تجریدی وضاحتوں کا استعمال کرنا اچھا عمل ہے۔ یہ مشق تجرید کے استعمال پر مبنی ہے - عام رویے اور خصوصیات کو الگ کرنا اور انہیں ایک تجریدی طبقے میں بند کرنا، یا صرف عام رویے کو الگ کرنا - ایسی صورت میں ہم ایک انٹرفیس بناتے ہیں۔ انٹرفیس اور طبقاتی وراثت پر مبنی اشیاء کا درجہ بندی بنانا اور ڈیزائن کرنا OOP پولیمورفزم کے اصول کو پورا کرنے کے لیے ایک شرط ہے۔ جاوا میں پولیمورفزم اور اختراعات کے معاملے کے بارے میں، ہم یہ ذکر کر سکتے ہیں کہ جاوا 8 سے شروع ہونے والی تجریدی کلاسز اور انٹرفیس بناتے وقت، کلیدی لفظ کا استعمال کرتے ہوئے بیس کلاسز میں تجریدی طریقوں کا ڈیفالٹ نفاذ لکھنا ممکن ہے default۔ مثال کے طور پر:
public interface Swim {
    default void swim() {
        System.out.println("Just floating");
    }
}
بعض اوقات وہ بنیادی کلاسوں میں طریقوں کے اعلان کے تقاضوں کے بارے میں پوچھ سکتے ہیں تاکہ پولیمورفزم کے اصول کی خلاف ورزی نہ ہو۔ یہاں سب کچھ آسان ہے: یہ طریقے جامد ، نجی اور حتمی نہیں ہونے چاہئیں ۔ پرائیویٹ طریقہ کو صرف کلاس میں دستیاب کرتا ہے، اور آپ اسے اولاد میں اوور رائڈ نہیں کر سکتے۔ جامد طریقہ کو کلاس کی خاصیت بناتا ہے، نہ کہ آبجیکٹ، لہذا سپرکلاس طریقہ کو ہمیشہ کہا جائے گا۔ فائنل طریقہ کو ناقابل تغیر اور اس کے وارثوں سے پوشیدہ کر دے گا۔

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

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

سفر کے لیے جدائی کے الفاظ

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