আপকাস্টিং এবং ডাউনকাস্টিং জাভা-র গুরুত্বপূর্ণ অঙ্গ, যা আমাদেরকে সরল বাক্য গঠন ব্যবহার করে জটিল প্রোগ্রামগুলি তৈরি করতে দেয় এবং পলিমারফিজম বা বিভিন্ন বস্তুর গোষ্ঠীকরণের মতো দুর্দান্ত সুবিধা দেয়। জাভা একটি সাবক্লাস টাইপের একটি অবজেক্টকে যে কোনও সুপারক্লাস টাইপের একটি অবজেক্ট হিসাবে বিবেচনা করার অনুমতি দেয়। একে বলা হয় আপকাস্টিং। আপকাস্টিংটি স্বয়ংক্রিয়ভাবে সম্পন্ন হয়, যখন ডাউনক্রাস্টিং অবশ্যই ম্যানুয়ালি প্রোগ্রামার দ্বারা করা উচিত এবং কেন আমি কেন তা ব্যাখ্যা করার জন্য আমার সেরাটা দিতে যাচ্ছি।
আপকাস্টিং এবং ডাউনকাস্টিং একে অপর থেকে আদিম কাস্টিংয়ের মতো নয়, এবং আমি বিশ্বাস করি যে প্রোগ্রামার কাস্টিং অবজেক্টগুলি শিখতে শুরু করার পরে এটি প্রচুর বিভ্রান্তি সৃষ্টি করে।
পলিমারফিজম: জাভাতে সমস্ত পদ্ধতি ডিফল্টরূপে ভার্চুয়াল। এর অর্থ এই যে চূড়ান্ত বা স্থিতিশীল হিসাবে ঘোষিত না হলে উত্তরাধিকার হিসাবে ব্যবহৃত হলে যে কোনও পদ্ধতি ওভাররাইড করা যেতে পারে ।
আপনি নীচের উদাহরণটি দেখতে পারেন কীভাবে getType();
বস্তুর (কুকুর, পোষা প্রাণী, পুলিশ কুকুর) ধরণ অনুযায়ী কাজ করে।
ধরুন আপনার কাছে তিনটি কুকুর রয়েছে
কুকুর - এটি সুপার ক্লাস।
পোষা কুকুর - পোষা কুকুর কুকুর প্রসারিত।
পুলিশ কুকুর - পুলিশ কুকুর পোষা কুকুর প্রসারিত।
public class Dog{
public String getType () {
System.out.println("NormalDog");
return "NormalDog";
}
}
/**
* Pet Dog has an extra method dogName()
*/
public class PetDog extends Dog{
public String getType () {
System.out.println("PetDog");
return "PetDog";
}
public String dogName () {
System.out.println("I don't have Name !!");
return "NO Name";
}
}
/**
* Police Dog has an extra method secretId()
*/
public class PoliceDog extends PetDog{
public String secretId() {
System.out.println("ID");
return "ID";
}
public String getType () {
System.out.println("I am a Police Dog");
return "Police Dog";
}
}
পলিমারফিজম: জাভাতে সমস্ত পদ্ধতি ডিফল্টরূপে ভার্চুয়াল। এর অর্থ এই যে চূড়ান্ত বা স্থিতিশীল হিসাবে ঘোষিত না হলে উত্তরাধিকার হিসাবে ব্যবহৃত হলে যে কোনও পদ্ধতি ওভাররাইড করা যেতে পারে ((ভার্চুয়াল টেবিল ধারণার সাথে ব্যাখ্যা)
ভার্চুয়াল সারণী / প্রেরণ সারণী: কোনও বস্তুর প্রেরণ সারণিতে অবজেক্টের গতিশীল বাউন্ড পদ্ধতিগুলির ঠিকানা থাকবে। অবজেক্টের প্রেরণ টেবিল থেকে পদ্ধতির ঠিকানা আনার মাধ্যমে পদ্ধতি কলগুলি সম্পাদিত হয়। প্রেরণ টেবিল একই শ্রেণীর অন্তর্ভুক্ত সমস্ত বস্তুর জন্য সমান এবং তাই সাধারণত তাদের মধ্যে ভাগ করা হয়।
public static void main (String[] args) {
/**
* Creating the different objects with super class Reference
*/
Dog obj1 = new Dog();
` /**
* Object of Pet Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry about it
*
*/
Dog obj2 = new PetDog();
` /**
* Object of Police Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry
* about it here even though we are extending PoliceDog with PetDog
* since PetDog is extending Dog Java automatically upcast for us
*/
Dog obj3 = new PoliceDog();
}
obj1.getType();
ছাপে Normal Dog
obj2.getType();
ছাপে Pet Dog
obj3.getType();
ছাপে Police Dog
ডাউন কাস্টিংটি ম্যানুয়ালি প্রোগ্রামার দ্বারা করা দরকার
যখন আপনি যে secretID();
পদ্ধতিটির উপর obj3
ভিত্তি করে PoliceDog object
কিন্তু বর্ণক্রমের Dog
একটি উচ্চ বর্গ যা উল্লেখ করা হয় তখন এটি ত্রুটি ছুঁড়ে দেয় কারণ পদ্ধতিটিতে obj3
অ্যাক্সেস নেই secretId()
। এই পদ্ধতিটি চালিত করার জন্য আপনাকে ডাউন কাস্ট করতে হবে যা ম্যানুয়ালি অ্যাজ 3 করে PoliceDog
( (PoliceDog)obj3).secretID();
যা প্রিন্ট করে ID
ক্লাসে dogName();
পদ্ধতিটি অনুরোধ করার জন্য একই পদ্ধতিতে PetDog
আপনাকে ডাউনকাস্ট obj2
করতে হবে PetDog
যেহেতু আপত্তি 2 তে রেফারেন্স করা হয়েছে Dog
এবং dogName();
পদ্ধতিটিতে অ্যাক্সেস নেই
( (PetDog)obj2).dogName();
কেন এমনটি হয়, সেই উজানটি স্বয়ংক্রিয় হয়, তবে ডাউনকাস্টিংটি ম্যানুয়াল হওয়া উচিত? ঠিক আছে, আপনি দেখুন, উজান কখনও ব্যর্থ হতে পারে না। কিন্তু আপনি যদি বিভিন্ন কুকুর একটি গ্রুপ আছে এবং তাদের সবাইকে ধরণ করার জন্য একটি থেকে downCast করতে চাই, তারপর সেখানে একটি সুযোগ, এই কুকুর কিছু ধরনের আসলে অর্থাৎ, যে PetDog
, PoliceDog
এবং প্রক্রিয়া, ব্যর্থ ছুঁড়ে ClassCastException
।
এই কারণেই যদি আপনি নিজের বস্তুগুলিকে সুপার ক্লাসের ধরণ হিসাবে উল্লেখ করে থাকেন তবে আপনাকে নিজের বস্তুগুলিকে ম্যানুয়ালি ডাউনকাস্ট করতে হবে ।
দ্রষ্টব্য: এখানে রেফারেন্স দেওয়ার অর্থ আপনি আপনার প্রকল্পগুলির মেমরিের ঠিকানা পরিবর্তন করছেন না যখন আপনি এটি ডাউনসেক্ট করেন এটি এখনও অবিরত থাকে আপনি কেবল তাদেরকে এই ক্ষেত্রে নির্দিষ্ট ধরণের গ্রুপিং করছেন are Dog
Dog
একটিAnimal
। আপনি নির্দিষ্ট ওভারলোডেড পদ্ধতিটি ব্যবহার না করতে চাইলে বেশিরভাগ বার আপকাস্টিং অপ্রয়োজনীয়।callme
উভয়Animal
এবং বিদ্যমানDog
।callme2
কেবলমাত্র বিদ্যমানDog
, যা আপনি নিক্ষেপa
করতেDog
এটি কাজ করা হয়।