CodeGym /جاوا بلاگ /Random-UR /جاوا میں مثال اور وراثت
John Squirrels
سطح
San Francisco

جاوا میں مثال اور وراثت

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

وراثت

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

   private String model;
   private int maxSpeed;
   private int yearOfManufacture;

   public Car(String model, int maxSpeed, int yearOfManufacture) {
       this.model = model;
       this.maxSpeed = maxSpeed;
       this.yearOfManufacture = yearOfManufacture;
   }
}

public class Truck extends Car {

   public Truck(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}

public class Sedan extends Car {
   public Sedan(String model, int maxSpeed, int yearOfManufacture) {
       super(model, maxSpeed, yearOfManufacture);
   }
}
کم از کم، ہم کوڈ کی غیر ضروری نقل سے بچتے ہیں (اور پروگرام لکھتے وقت ہمیں ہمیشہ اس کے لیے کوشش کرنی چاہیے)۔ اس کے علاوہ، ہمارے پاس ایک سادہ اور قابل فہم طبقاتی ڈھانچہ ہے، جس میں تمام فیلڈز ایک کلاس میں سمیٹ کر تمام کاروں کے لیے مشترک ہیں۔ اگر ٹرکوں کے پاس کوئی خاص فیلڈ ہے جو دوسری کاروں میں نہیں ہے، تو انہیں Truckکلاس میں قرار دیا جا سکتا ہے۔ طریقوں کے لئے بھی یہی ہے۔ Carتمام کاروں کے کچھ مشترکہ رویے ہوتے ہیں جن کو طریقوں سے بیان کیا جا سکتا ہے، مثلاً کار کو اسٹارٹ کرنا، تیز کرنا/بریک لگانا وغیرہ۔ ان عام طریقوں کو پیرنٹ کلاس میں اکٹھا کیا جا سکتا ہے، اور ہر مخصوص قسم کی کار اپنی اخذ کردہ کلاسوں میں اپنے منفرد اعمال کی وضاحت کر سکتی ہے۔ .
public class Car {

   public void gas() {
       // Accelerate
   }

   public void brake() {
       // Brake
   }
}


public class F1Car extends Car {

   public void pitStop() {

       // Only race cars make pit stops
   }

   public static void main(String[] args) {

       F1Car formula1Car = new F1Car();
       formula1Car.gas();
       formula1Car.pitStop();
       formula1Car.brake();
   }
}
ہم نے کلاس میں تمام کاروں میں عام طریقوں کو شامل کیا Car۔ لیکن، کلاس کو دیکھیں F1Car، جو "فارمولا 1" ریس کاروں کی نمائندگی کرتی ہے۔ پٹ اسٹاپس (کار کی فوری دیکھ بھال کے لیے اسٹاپس) صرف ریس میں کیے جاتے ہیں، اس لیے ہم نے اس مخصوص فعالیت کو متعلقہ اخذ کردہ کلاس میں شامل کیا۔ مثال اور وراثت 101 - 2

آپریٹر کی مثال

جاوا میں، ایک خاص آپریٹر ہے، مثال کے طور پر ، یہ جانچنے کے لیے کہ آیا کوئی چیز کسی خاص کلاس کی بنیاد پر بنائی گئی ہے۔ یہ چیک کے نتیجہ کے لحاظ سے صحیح یا غلط واپس آتا ہے۔ آئیے دیکھتے ہیں کہ یہ ہماری کار کی مثال میں کلاسز کا استعمال کرتے ہوئے کیسے کام کرتا ہے:
public class Truck extends Car {

   public static void main(String[] args) {

       Truck truck = new Truck();
       System.out.println(truck instanceof Car);
   }
}
آؤٹ پٹ: true آپریٹر trueinstanceof واپس کرتا ہے ، کیونکہ ہمارے پاس ایک چیز ہے، اور تمام ٹرک کاریں ہیں۔ کلاس کلاس سے ماخوذ ہے ۔ تمام ٹرک مشترکہ والدین، کلاس کی بنیاد پر بنائے گئے ہیں۔ آپریٹر کو کس طرح استعمال کیا جاتا ہے اس کو قریب سے دیکھیں ۔ آپ اسے مدت کے بغیر لکھتے ہیں، کیونکہ یہ ایک آپریٹر ہے، طریقہ نہیں ("کلاس کی آبجیکٹ مثال")۔ آئیے دوسرا طریقہ آزماتے ہیں: TruckTruckCarCarinstanceof
public static void main(String[] args) {

   Car car = new Car();
   System.out.println(car instanceof Truck);
}
آؤٹ پٹ: غلط کلاس (اور کار آبجیکٹ) کلاس Carسے اخذ نہیں ہوتی ہے ۔ Truckتمام ٹرک کاریں ہیں، لیکن تمام کاریں ٹرک نہیں ہیں۔ Carاشیاء کلاس پر مبنی نہیں ہیں Truck۔ ایک اور مثال:
public static void main(String[] args) {

   Car car = new Car();
   Truck truck = new Truck();
   System.out.println(car instanceof Object && truck instanceof Object);
}
آؤٹ پٹ: سچ یہاں منطق بھی آسان ہے: جاوا میں تمام کلاسز بشمول آپ جو کلاسز بناتے ہیں، کلاس سے اترتے ہیں Object(حالانکہ آپ "ایکسٹینڈ آبجیکٹ" نہیں لکھتے — یہ پہلے سے ہی مضمر ہے)۔ یہ کیسے اور کب مفید ہو گا؟ طریقہ کو اوور رائیڈ کرتے وقت آپریٹر instanceofسب سے زیادہ استعمال ہوتا ہے equals()۔ equalsمثال کے طور پر، کلاس میں طریقہ کار کو کیسے لاگو کیا جاتا ہے String:
public boolean equals(Object anObject) {
   if (this == anObject) {
       return true;
   }
   if (anObject instanceof String) {
       String anotherString = (String) anObject;
       int n = value.length;
       if (n == anotherString.value.length) {
           char v1[] = value;
           char v2[] = anotherString.value;
           int i = 0;
           while (n-- != 0) {
               if (v1[i] != v2[i])
                       return false;
               i++;
           }
           return true;
       }
   }
   return false;
}
پاس شدہ آبجیکٹ سے موازنہ کرنے سے پہلے String، طریقہ یہ جانچتا ہے کہ آیا آبجیکٹ ایک تار بھی ہے؟ تب ہی یہ دونوں اشیاء کی خصوصیات کا موازنہ کرنا شروع کر دیتا ہے۔ اگر یہ ٹیسٹ موجود نہیں تھا تو، قدر اور لمبائی والے فیلڈز کے ساتھ کسی بھی چیز کو طریقہ کار میں منتقل کیا جا سکتا ہے اور اس کا موازنہ String کے ساتھ کیا جا سکتا ہے، جو یقیناً غلط ہوگا۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION