اچھا دن، جاوراش آدمی. مجھے جاوا میں کاسٹنگ ریفرنس کی اقسام کے بارے میں سوالات موصول ہونے لگے۔ ہر بار ایک ہی چیز کو دوبارہ نہ کہنے کے لیے، میں نے ایک مختصر مضمون لکھنے کا فیصلہ کیا۔
پہلے، آئیے دیکھتے ہیں کہ کاسٹنگ کس قسم کی ہے۔
قسم کاسٹنگ (قسم کی تبدیلی) ایک قسم کی متغیر قدر کو دوسری قسم کی قدر میں تبدیل کرنا ہے۔ آئیے ایک مثال دیکھتے ہیں کہ یہ کیا ہے اور اسے کس چیز کے ساتھ کھایا جاتا ہے۔ ہمارے پاس کچھ طبقاتی درجہ بندی ہے ( تصویر 1 دیکھیں )۔ یہاں آپ درجہ بندی کی تمام کلاسیں دیکھ سکتے ہیں، کون کس کو وراثت میں ملا ہے، اور ہر کلاس کے طریقے۔ ایک توسیع اور معاہدہ کی علت ہے۔ ہم دیکھتے ہیں کہ طبقہCat
طبقے کی نسل ہے Pet
۔ Pet
، بدلے میں، کلاس کا جانشین ہے Animal
۔ جب ہم لکھتے ہیں:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
یہ ایک پھیلتی ہوئی کاسٹ (یا ایک مضمر) ہے۔ ہم نے لنکس کو بڑھا دیا ہے animalCat
اور animalDog
. وہ اشیاء Cat
اور Dog
. ایسی کاسٹ کے ساتھ، ہم animalCat/animalDog
کسی حوالہ کے ذریعے طریقوں کو کال نہیں کر سکتے جو میں ہیں Cat/Dog
، لیکن جو میں نہیں ہیں Animal
۔ ایک تنگ (یا واضح) کاسٹ مخالف سمت میں ہوتا ہے:
Animal animalCat = new Cat();
Animal animalDog = new YorkshireTerrier();
Cat cat =(Cat)animalCat;
YorkshireTerrier dog = (YorkshireTerrier) animalDog;
ہم نے واضح طور پر اشارہ کیا ہے کہ ہم اس اعتراض کو کس قسم میں ڈالنا چاہتے ہیں۔ لیکن ہوشیار رہنا!!! اگر آپ اسے اس طرح کرتے ہیں:
Animal animalCat = new Cat();
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
مرتب کرنے والا اس کوڈ کو چھوڑ دے گا۔ لیکن RunTime
یہ آپ کو باہر پھینک دے گا:
Exception in thread "main" java.lang.ClassCastException: Animals.Cat cannot be cast to Animals.YorkshireTerrier
RunTime
دیکھتا ہے کہ دو مختلف طبقات Cat
ہیں ۔ تبادلوں کو تنگ کرنے کے دوران ClassCastExceptionYorkshireTerrier
سے بچنے کے لیے ، استعمال کریں ۔ instanceof
Animal animalCat = new Cat();
if (animalCat instanceof YorkshireTerrier)
{
YorkshireTerrier dog = (YorkshireTerrier) animalCat;
}
اگر animalCat
ہے YorkshireTerrier
تو اسائنمنٹ ہو جائے گا، اگر نہیں تو کچھ نہیں ہو گا۔
اب یہ کیوں ضروری ہے اگر ہم طریقے کھو دیں اور ایسی غلطیاں حاصل کر سکیں
آئیے اس کوڈ کو دیکھتے ہیں جو میں نے تصویر میں دیے گئے خاکے کے مطابق بنایا تھا۔ 1 . کلاسAnimal
public abstract class Animal
{
String name;
int age;
String nameOfClass = getClass().getSimpleName();
public void eat(){
System.out.println(nameOfClass + ": Omnomnom");
}
public void sleep(){
System.out.println(nameOfClass + ": Z-z-z-z");
}
}
ایک طبقہ WildAnimal
جو وراثت میں ملتا ہے۔Animal
public abstract class WildAnimal extends Animal
{
public void steelChicken()
{
System.out.println(nameOfClass+": Muhaha,I stole a chicken!");
}
}
ایک طبقہ Pet
جو وراثت میں ملتا ہے۔Animal
public abstract class Pet extends Animal
{
public void peeInTray(){
System.out.println(nameOfClass + ": Master, I peed");
}
}
ایک طبقہ Fox
جو وراثت میں ملتا ہے۔WildAnimal
public class Fox extends WildAnimal
{
public void eatColobok(){
System.out.println(nameOfClass + ": I will eat you, Colobok");
}
}
ایک طبقہ Wolf
جو وراثت میں ملتا ہے۔WildAnimal
public class Wolf extends WildAnimal
{
public void hawlAtTheMoon(){
System.out.println(nameOfClass + ": Ouuuuu!!!Ouuuu!!!");
}
}
ایک طبقہ Cat
جو وراثت میں ملتا ہے۔Pet
public class Cat extends Pet
{
public void sleepOnKeyboard(){
System.out.println(nameOfClass + ": Master, stop working!!I wanna sleep on your keyboard");
}
}
ایک طبقہ YorkshireTerrier
جو وراثت میں ملتا ہے۔Pet
public class YorkshireTerrier extends Pet
{
public void bark(){
System.out.println(nameOfClass + ": Meow!!! Meow!!!");
}
}
صورتحال کا تصور کریں۔ ہمیں تمام جانوروں کو ایک فہرست میں جمع کرنے، انہیں کھانا کھلانے اور پھر بستر پر ڈالنے کی ضرورت ہے۔ یہ کرنا آسان ہے اگر ہم ArrayList
جانور ( Animal
) بنائیں۔ اور پھر ہم ہر جانور کے لیے متعلقہ طریقوں کو کہتے ہیں:
public class ZOO
{
public static void main(String[] args)
{
List<Animal> allAnimals = new ArrayList<>();
allAnimals.add(new Cat());
allAnimals.add(new Wolf());
allAnimals.add(new Fox());
allAnimals.add(new YorkshireTerrier());
for (Animal animal : allAnimals)
{
animal.eat();
animal.sleep();
}
}
}
animal
میں طریقہ کو کال نہیں کر سکتا bark()
یا sleepOnKeyboard()
. کیونکہ شیٹ allAnimals
میں ایک بلی، ایک بھیڑیا، ایک یارک اور ایک لومڑی ہے، لیکن وہ کم ہو کر Animal
. اور ان کے پاس صرف وہ طریقے ہیں جو اس میں ہیں Animal
۔ یہ بہت اچھی بات ہے، کیونکہ اگر ہم تمام طریقوں کو کہہ سکتے ہیں، تو پھر ہمیں کی بورڈ پر سوتے ہوئے بھیڑیے یا مرغیوں کو چرانے والے یارک کی کیا ضرورت ہے؟ آپکی توجہ کا شکریہ. مجھے امید ہے کہ یہ مضمون آپ کے لیے مفید ثابت ہوگا۔ تنقید اور تبصرے خوش آئند ہیں)
GO TO FULL VERSION