CodeGym /جاوا بلاگ /Random-UR /انٹرفیس میں پہلے سے طے شدہ طریقے
John Squirrels
سطح
San Francisco

انٹرفیس میں پہلے سے طے شدہ طریقے

گروپ میں شائع ہوا۔
جاوا کا ہر نیا ورژن ان سے مختلف ہے جو پہلے آیا تھا۔ یہاں مواد میں تبدیلیوں کی ایک مثال ہے جس کا ہم نے احاطہ کیا ہے: Java 5 سے پہلے، زبان میں enums نہیں تھا۔ انٹرفیس میں پہلے سے طے شدہ طریقے - 1اسی طرح، جاوا 8 جاوا 7 سے واضح طور پر مختلف ہے۔ ہمارے زیادہ تر اسباق زبان کے 7ویں ورژن کے لیے لکھے گئے تھے، لیکن یقیناً ہم اہم اختراعات کو نظر انداز نہیں کریں گے۔ چونکہ ہم پہلے ہی اس سبق میں انٹرفیس کے بارے میں بات کر رہے ہیں، اس لیے ہم ایک اپ ڈیٹ پر غور کریں گے — انٹرفیس میں پہلے سے طے شدہ طریقے ۔ آپ پہلے ہی جانتے ہیں کہ انٹرفیس برتاؤ کو نافذ نہیں کرتا ہے ۔ اس کا کام اس طرز عمل کو بیان کرنا ہے جو اسے نافذ کرنے والی تمام اشیاء کا ہونا ضروری ہے ۔ لیکن ڈویلپرز کو اکثر ایسے حالات کا سامنا کرنا پڑتا ہے جہاں طریقہ کار کا نفاذ تمام کلاسوں میں یکساں ہوتا ہے۔ آئیے اپنی پرانی کار کی مثال پر غور کریں:
public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
"آپ کی رائے میں، اس کوڈ کے ساتھ بنیادی مسئلہ کیا ہے؟ آپ نے شاید محسوس کیا ہے کہ ہم نے بار بار کوڈ کا ایک گروپ لکھا ہے! یہ مسئلہ پروگرامنگ میں عام ہے، اور آپ کو اس سے بچنے کی ضرورت ہے۔ یہ دوسری بات ہے کہ اس سے پہلے کوئی خاص حل موجود نہیں تھا۔ جاوا 8 جاری کیا گیا تھا۔ اس ورژن کے ساتھ پہلے سے طے شدہ طریقوں کی وضاحت کرنے اور انہیں انٹرفیس کے اندر ہی لاگو کرنے کی صلاحیت آئی ! یہاں آپ اسے کیسے کرتے ہیں:
public interface Car {

   public default void gas() {
       System.out.println("Gas!");
   }

   public default void brake() {
       System.out.println("Brake!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
اب gas()اور brake()طریقے، جو تمام کاروں کے لیے ایک جیسے تھے، کو انٹرفیس میں منتقل کر دیا گیا ہے۔ بار بار کوڈ کی ضرورت نہیں ہے۔ مزید کیا ہے، طریقے ہر کلاس میں دستیاب ہیں!
public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
کیا ہوگا اگر طریقہ کار کے ساتھ 100 کلاسز ہیں gas()، لیکن ان میں سے صرف 99 کا رویہ ایک جیسا ہے؟ کیا یہ سب کچھ برباد کر دیتا ہے اور پہلے سے طے شدہ طریقہ کو اس صورت حال کے لیے نااہل بنا دیتا ہے؟ بالکل، نہیں :) انٹرفیس میں پہلے سے طے شدہ طریقوں کو عام طریقوں کی طرح اوور رائڈ کیا جا سکتا ہے۔
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car decelerates differently!");
   }
}
تمام 99 قسم کی کاریں پہلے سے طے شدہ طریقہ کو نافذ کریں گی، اور UnusualCarکلاس، جو کہ ایک استثناء ہے، مجموعی تصویر کو خراب نہیں کرے گی اور پرسکون طریقے سے اپنے رویے کی وضاحت کرتی ہے۔ انٹرفیس کی ایک سے زیادہ وراثت۔ جیسا کہ آپ پہلے ہی جانتے ہیں، جاوا متعدد وراثت کی حمایت نہیں کرتا ہے۔ اس کی بہت سی وجوہات ہیں۔ ہم ان کو ایک الگ سبق میں تفصیل سے دیکھیں گے۔ دوسری زبانیں، جیسے C++، اس کی حمایت کرتی ہیں۔ متعدد وراثت کے بغیر، ایک سنگین مسئلہ پیدا ہوتا ہے: ایک چیز میں کئی مختلف خصوصیات اور 'رویے' ہوسکتے ہیں۔ یہاں زندگی کی ایک مثال ہے: ہم اپنے والدین کے لیے بچے، اپنے اساتذہ کے لیے طالب علم، اور اپنے ڈاکٹروں کے لیے مریض ہیں۔ زندگی میں، ہم مختلف کردار ادا کرتے ہیں اور، اس کے مطابق، مختلف طریقے سے برتاؤ کرتے ہیں: ظاہر ہے، ہم اساتذہ کے ساتھ اس طرح بات نہیں کریں گے جیسے ہم اپنے قریبی دوستوں سے کرتے ہیں۔ آئیے اس کو کوڈ میں ترجمہ کرنے کی کوشش کرتے ہیں۔ تصور کریں کہ ہمارے پاس دو طبقے ہیں: تالاب اور ایویری۔ تالاب کے لیے، ہمیں پانی کے پرندے کی ضرورت ہے۔ aviary کے لیے ہمیں اڑنے والے پرندوں کی ضرورت ہے۔ ایسا کرنے کے لیے، ہم نے دو بیس کلاسز بنائے ہیں: FlyingBirdاور Waterfowl۔
public class Waterfowl {
}

public class FlyingBird {
}
اس کے مطابق، ہم ان پرندوں کو بھیجیں گے جن کی کلاسیں وراثت FlyingBirdمیں ملتی ہیں، اور ہم ان پرندوں کو Waterfowlتالاب میں بھیجیں گے جو وراثت میں ملتے ہیں۔ یہ سب بہت آسان لگتا ہے۔ لیکن ہم بطخ کو کہاں بھیجیں؟ یہ تیرتا ہے اور اڑتا ہے۔ اور ہمارے پاس ایک سے زیادہ وراثت نہیں ہے۔ خوش قسمتی سے، جاوا انٹرفیس کے متعدد نفاذ کی حمایت کرتا ہے۔ اگرچہ ایک کلاس کئی والدین کی وارث نہیں ہو سکتی، لیکن یہ آسانی سے کئی انٹرفیس کو نافذ کر سکتی ہے! ہماری بطخ ایک اڑتا ہوا پرندہ اور ایک آبی پرندہ دونوں ہو سکتا ہے :) ہمیں مطلوبہ نتیجہ حاصل کرنے کے لیے کلاسوں کے بجائے صرف بنانے FlyingBirdاور انٹرفیس کرنے کی ضرورت ہے۔Waterfowl
public class Duck implements FlyingBird, Waterfowl {

   // The methods of both interfaces can be easily combined into one class

   @Override
   public void fly() {
       System.out.println("Fly!");
   }

   @Override
   public void swim() {

       System.out.println("Swim!");
   }
}
اس کے مطابق، ہمارا پروگرام کلاسز کی لچک کو برقرار رکھتا ہے، اور پہلے سے طے شدہ طریقوں کے ساتھ مل کر، اشیاء کے رویے کی وضاحت کرنے کی ہماری صلاحیت تقریباً لامحدود ہو جاتی ہے! :)
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION