JavaRush /جاوا بلاگ /Random-SD /جاوا ۾ خلاصو ڪلاس ڪنڪريٽ مثالن سان

جاوا ۾ خلاصو ڪلاس ڪنڪريٽ مثالن سان

گروپ ۾ شايع ٿيل
سلام! پوئين ليڪچرن ۾، اسان انٽرفيس کان واقف ٿياسين ۽ معلوم ڪيو ته انهن جي ڪهڙي ضرورت آهي. اڄ جي موضوع ۾ پوئين موضوع سان ڪجهه مشترڪ هوندو. اچو ته جاوا ۾ خلاصي ڪلاس بابت ڳالهايون.جاوا ۾ خلاصو ڪلاس ڪنڪريٽ مثالن سان - 1

ڇو طبقن کي "خلاصو" سڏيو ويندو آهي

توهان کي شايد ياد هوندو ته ”تجزيه“ ڇا آهي - اسان اڳ ۾ ئي ان کي ڍڪي ڇڏيو آهي :) جيڪڏهن توهان اوچتو وساري ڇڏيو، اهو ٺيڪ آهي، اچو ته ياد رکون: هي OOP جو اصول آهي ، جنهن جي مطابق، جڏهن ڪلاس ڊزائين ڪرڻ ۽ شيون ٺاهيندي، اهو ضروري آهي. صرف هڪ اداري جي مکيه خاصيتن کي نمايان ڪريو ۽ ثانوي ملڪيت کي رد ڪريو. مثال طور، جيڪڏهن اسان هڪ ڪلاس ٺاهي رهيا آهيون SchoolTeacher- هڪ اسڪول جو استاد - اسان کي ممڪن ناهي ته " اونچائي " خاصيت جي ضرورت هجي. درحقيقت: هڪ استاد لاء هي خاصيت اهم ناهي. پر جيڪڏهن اسان پروگرام ۾ هڪ ڪلاس ٺاهي سگهون ٿا BasketballPlayer- هڪ باسڪيٽ بال پليئر - اونچائي بنيادي خاصيتن مان هڪ بڻجي ويندو. تنهن ڪري، هڪ تجريدي طبقو مستقبل جي طبقن جي هڪ گروهه لاءِ سڀ کان وڌيڪ خلاصو، اوه-تقريبن ”خالي“ آهي. هي تياري ان جي مڪمل فارم ۾ استعمال نه ٿو ڪري سگهجي - اهو تمام "خام" آهي. پر اهو هڪ خاص عام حالت ۽ رويي کي بيان ڪري ٿو جيڪو مستقبل جي طبقن - تجريدي طبقي جا وارث - هوندو.

جاوا خلاصو ڪلاس جا مثال

اچو ته ڪارن سان هڪ سادي مثال ڏسو:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public abstract void gas();

   public abstract void brake();

   public String getModel() {
       return model;
   }

   public void setModel(String model) {
       this.model = model;
   }

   public String getColor() {
       return color;
   }

   public void setColor(String color) {
       this.color = color;
   }

   public int getMaxSpeed() {
       return maxSpeed;
   }

   public void setMaxSpeed(int maxSpeed) {
       this.maxSpeed = maxSpeed;
   }
}
اهو ئي آهي جيڪو آسان ترين خلاصو ڪلاس وانگر نظر اچي ٿو. جئين توهان ڏسي سگهو ٿا، ڪجهه خاص ناهي :) اسان کي ان جي ڪهڙي ضرورت آهي؟ سڀ کان پهريان، هن اهو بيان ڪيو آهي ته اسان کي لازمي طور تي سڀ کان وڌيڪ تجريدي طريقي سان گهربل آهي - هڪ ڪار. لفظ خلاصو هتي هڪ سبب لاء آهي. دنيا ۾ ڪابه ”صرف مشين“ ناهي. اتي ٽرڪون، ريس ڪارون، sedans، coupes، SUVs آهن. اسان جو خلاصو ڪلاس صرف هڪ ”بليو پرنٽ“ آهي جنهن مان اسان بعد ۾ ڪار ڪلاس ٺاهينداسين.
public class Sedan extends Car {

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

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }

}
اهو گهڻو ڪجهه آهي جيڪو اسان وراثت بابت ليڪچرن ۾ ڳالهايو آهي. صرف اتي اسان وٽ هڪ طبقو Car۽ ان جا طريقا هئا جيڪي خلاصا نه هئا. پر هن حل ۾ ڪيترائي نقصان آهن، جن کي خلاصو طبقن ۾ درست ڪيو وڃي ٿو. سڀ کان پهريان ۽ سڀ کان اهم، هڪ خلاصو طبقي جو هڪ مثال ٺاهي نٿو سگهجي:
public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Error! The Car class is abstract!
   }
}
هي "چال" خاص طور تي جاوا جي تخليق ڪندڙن طرفان لاڳو ڪيو ويو آهي. هڪ ڀيرو ٻيهر، صرف ياد رکڻ لاء: هڪ خلاصو ڪلاس صرف مستقبل جي "عام" طبقن لاء هڪ نقشو آهي . توهان کي ڊرائنگ جي ڪاپي جي ضرورت ناهي، صحيح؟ تنهن ڪري هتي تجريدي طبقي جا مثال ٺاهڻ جي ڪا ضرورت ناهي :) ۽ جيڪڏهن ڪلاس Carخلاص نه هجي ها ته اسان آساني سان ان جون شيون ٺاهي سگهون ٿا:
public class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       // some logic
   }

   public  void brake() {
       // some logic
   }
}


public class Main {

   public static void main(String[] args) {

       Car car = new Car(); // Everything is OK, the machine has been created
   }
}
هاڻي اسان وٽ اسان جي پروگرام ۾ ڪجهه قسم جي ناقابل ڪار ڪار آهي - نه ٽرڪ، نه ريسنگ ڪار، نه هڪ سيڊان، پر عام طور تي ڪجهه. اها ساڳي ”صرف هڪ مشين“ جيڪا فطرت ۾ موجود ناهي. ساڳيو مثال جانورن سان به ڏئي سگهجي ٿو. تصور ڪريو ته شيون توهان جي پروگرام ۾ ظاهر ٿيو Animal- " صرف هڪ جانور ". اهو ڪهڙي قسم جو آهي، ڪهڙي خاندان سان تعلق رکي ٿو، ان ۾ ڪهڙيون خاصيتون آهن، اهو واضح ناهي. هن کي پروگرام ۾ ڏسي عجيب لڳندو هو. فطرت ۾ ڪو به "صرف جانور" ناهي. صرف ڪتا، ٻليون، لومڙ، مول ۽ ٻيا. خلاصو ڪلاس اسان کي ” صرف شين “ کان آزاد ڪن ٿا. اهي اسان کي هڪ بنيادي رياست ۽ رويي ڏي. مثال طور، سڀني ڪارن کي هڪ ماڊل ، رنگ ۽ وڌ ۾ وڌ رفتار هجڻ گهرجي، ۽ اهي پڻ گئس ۽ بريڪ ڪرڻ جي قابل هوندا . اهو ئي سڀ ڪجهه آهي. هي هڪ عام خلاصو اسڪيم آهي، پوءِ توهان پنهنجو پاڻ کي ڊزائين ڪيو جيڪي توهان کي گهربل آهن. مهرباني ڪري نوٽ ڪريو: هڪ تجريدي طبقي ۾ ٻه طريقا پڻ تجزياتي طور نامزد ڪيا ويا آهن ، ۽ انهن تي عمل نه ڪيو ويو آهي. سبب ساڳيو آهي: خلاصو طبقن "صرف مشينن" لاء "ڊفالٽ رويي" پيدا نه ڪندا آهن. اهي صرف چون ٿا ته اهي سڀئي ڪارٽون ٺاهڻ جي قابل هوندا. تنهن هوندي، جيڪڏهن توهان کي اڃا تائين ڊفالٽ رويي جي ضرورت آهي، توهان طريقن کي لاڳو ڪري سگهو ٿا تجريدي طبقي ۾. جاوا هن کي منع نٿو ڪري:
public abstract class Car {

   private String model;
   private String color;
   private int maxSpeed;

   public void gas() {
       System.out.println("Let's go!");
   }

   public abstract void brake();

   //getters and setters
}


public class Sedan extends Car {

   @Override
   public void brake() {
       System.out.println("The sedan slows down!");
   }

}

public class Main {

   public static void main(String[] args) {

       Sedan sedan = new Sedan();
       sedan.gas();
   }
}
ڪنسول آئوٽ: "تيز رفتار حاصل ڪريو!" جئين توهان ڏسي سگهو ٿا، اسان هڪ طريقو لاڳو ڪيو خلاصي طبقي ۾، پر ٻيو عمل نه ڪيو. نتيجي طور، اسان جي طبقي جي رويي کي Sedanٻن حصن ۾ ورهايو ويو: جيڪڏھن توھان ان تي ھڪڙي طريقي کي سڏيندا آھيو gas()، اھو والدين خلاصي ڪلاس مان "pll up" ڪندو Car، ۽ brake()اسان ڪلاس ۾ طريقي جي نئين وضاحت ڪئي Sedan. اهو تمام آسان ۽ لچڪدار ثابت ٿيو. پر هاڻي اسان جو طبقو ايترو ته خلاصو ناهي ؟ سڀ کان پوء، حقيقت ۾، هن جي طريقن جي اڌ تي عمل ڪيو وڃي ٿو. حقيقت ۾ - ۽ هي هڪ تمام اهم خصوصيت آهي - هڪ طبقو خلاصو آهي جيڪڏهن گهٽ ۾ گهٽ هڪ طريقو خلاصو آهي . گهٽ ۾ گهٽ هڪ ٻن مان، گهٽ ۾ گهٽ هڪ هزار طريقن مان - اهو مسئلو ناهي. اسان سڀني طريقن کي به لاڳو ڪري سگهون ٿا ۽ ڪنهن به تجريدي کي نه ڇڏينداسين. خلاصي طريقن کان سواءِ هڪ خلاصو طبقو هوندو. اصول ۾، اهو ممڪن آهي، ۽ مرتب ڪندڙ غلطيون پيدا نه ڪندو، پر اهو بهتر ناهي ته اهو نه ڪيو وڃي: لفظ خلاصو پنهنجي معني وڃائي ڇڏيندو، ۽ توهان جا ساٿي پروگرامر اهو ڏسي حيران ٿي ويندا:/ ان کان علاوه، جيڪڏهن هڪ طريقو لفظ خلاصي سان نشان لڳل آهي، هر نسلي طبقي کي لازمي طور تي لاڳو ڪيو وڃي يا خلاصو قرار ڏنو وڃي. ٻي صورت ۾ گڏ ڪرڻ وارو هڪ غلطي اڇلائي ڇڏيندو . يقينن، هر طبقو صرف هڪ خلاصي طبقي مان وارث ٿي سگهي ٿو، تنهنڪري وراثت جي لحاظ کان خلاصي ۽ باقاعده طبقن ۾ ڪو به فرق ناهي. اهو مسئلو ناهي ته ڇا اسان هڪ تجريدي طبقي مان ورثي ۾ آهيون يا هڪ باقاعده طبقي مان، اتي صرف هڪ والدين طبقو ٿي سگهي ٿو.

جاوا ۾ هڪ کان وڌيڪ طبقاتي ورثي ڇو نه آهي؟

اسان اڳ ۾ ئي چئي چڪا آهيون ته جاوا ۾ هڪ کان وڌيڪ وراثت ناهي، پر اسان حقيقت ۾ اهو نه ڄاڻايو آهي ته ڇو. اچو ته ھاڻي ھي ڪوشش ڪريون. نقطو اهو آهي ته جيڪڏهن جاوا وٽ ڪيترائي وراثت آهن، ٻار طبقن کي اهو فيصلو ڪرڻ جي قابل نه هوندو ته ڪهڙو رويو چونڊيو وڃي. اچو ته اسان وٽ ٻه طبقا آهن - Toster۽ NuclearBomb:
public class Toster {


 public void on() {

       System.out.println("The toaster is on, the toast is getting ready!");
   }

   public void off() {

       System.out.println("The toaster is off!");
   }
}


public class NuclearBomb {

   public void on() {

       System.out.println("Взрыв!");
   }
}
جئين توهان ڏسي سگهو ٿا، ٻنهي وٽ هڪ طريقو آهي on(). ٽوسٽر جي صورت ۾، اهو ٽوسٽ کي پچائڻ شروع ڪري ٿو، ۽ ايٽمي بم جي صورت ۾، اهو هڪ ڌماڪي جو سبب بڻائيندو آهي. اوه :/ هاڻي تصور ڪريو ته توهان فيصلو ڪيو (مون کي خبر ناهي ڇو اوچتو!) وچ ۾ ڪجهه ٺاهڻ لاءِ. ۽ هتي اهو توهان جي ڪلاس آهي - MysteriousDevice! هي ڪوڊ، يقينا، ڪم نٿو ڪري، ۽ اسان ان کي صرف هڪ مثال طور پيش ڪيو آهي "اهو ڪيئن ٿي سگهي ٿو":
public class MysteriousDevice extends Toster, NuclearBomb {

   public static void main(String[] args) {

       MysteriousDevice mysteriousDevice = new MysteriousDevice();
       mysteriousDevice.on(); // And what should happen here? Will we get a toast, or a nuclear apocalypse?
   }
}
اچو ته ڏسون ته اسان کي ڇا مليو. پراسرار ڊوائيس ٻنهي ٽاسٽر ۽ ايٽمي بم مان اچي ٿو. ٻنهي وٽ هڪ طريقو آهي on()، ۽ نتيجي طور، اهو واضح ناهي ته ڪهڙو طريقو on()اعتراض تي فائر ڪرڻ گهرجي MysteriousDeviceجيڪڏهن اسان ان کي سڏين ٿا. اعتراض اهو سمجهي نه سگهندو. خير، ڪيڪ تي چيري وانگر: ايٽمي بم جو ڪو طريقو ناهي off()، تنهنڪري جيڪڏهن اسان غلط اندازو لڳايو، ته ڊوائيس کي بند ڪرڻ جو ڪو طريقو ناهي. جاوا ۾ خلاصو ڪلاس ڪنڪريٽ مثالن سان - 2 اهو خاص طور تي هن مونجهاري جي ڪري، جڏهن ڪو اعتراض واضح ناهي ته اهو ڪهڙو رويو چونڊڻ گهرجي، ته جاوا جي تخليق ڪندڙن ڪيترن ئي ورثي کي ڇڏي ڏنو. بهرحال، توهان کي ياد آهي ته جاوا ڪلاس ڪيترن ئي انٽرفيس کي لاڳو ڪن ٿا. رستي ۾، توهان اڳ ۾ ئي توهان جي پڙهائي ۾ گهٽ ۾ گهٽ هڪ تجريدي طبقي سان منهن ڪيو آهي! جيتوڻيڪ، شايد مون ان کي نوٽيس نه ڪيو :)
public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>
هي تنهنجو پراڻو دوست ڪلاس آهي Calendar. اهو خلاصو آهي ۽ ڪيترائي وارث آهن. انهن مان هڪ آهي GregorianCalendar. توھان اڳ ۾ ئي تاريخن بابت سبقن ۾ استعمال ڪيو آھي :) سڀ ڪجھ واضح ٿيڻ لڳي ٿو، رڳو ھڪڙو نقطو بچيو آھي: خلاصو طبقن ۽ انٽرفيس جي وچ ۾ بنيادي فرق ڇا آھي ؟ انهن ٻنهي کي جاوا ۾ ڇو شامل ڪيو، ۽ پاڻ کي صرف هڪ تائين محدود نه ڪيو؟ اهو ڪافي ٿي سگهي ٿو. اسان ان بابت ايندڙ ليڪچر ۾ ڳالهائينداسين! ملندا سين:)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION