"হাই, অ্যামিগো! আজকের পাঠের বিষয় হল রূপান্তরগুলিকে প্রশস্ত করা এবং সংকীর্ণ করা৷ আপনি আদিম প্রকারগুলিকে প্রশস্ত করা এবং সংকীর্ণ করার বিষয়ে অনেক আগেই শিখেছেন৷ 10 স্তরে৷ আজ আমরা রেফারেন্স প্রকারের জন্য এটি কীভাবে কাজ করে সে সম্পর্কে কথা বলতে যাচ্ছি, যেমন ক্লাসের উদাহরণ।"

আসলে, এটা সব বেশ সহজ. একটি ক্লাসের উত্তরাধিকার শৃঙ্খল কল্পনা করুন: ক্লাস, তার পিতামাতা, পিতামাতার পিতা, ইত্যাদি, অবজেক্ট ক্লাসে ফিরে আসা। যেহেতু একটি ক্লাসে এটির উত্তরাধিকারসূত্রে পাওয়া ক্লাসের সমস্ত সদস্য পদ্ধতি রয়েছে , তাই ক্লাসের একটি উদাহরণ একটি ভেরিয়েবলে সংরক্ষণ করা যেতে পারে যার ধরন তার পিতামাতার যেকোন।

এখানে একটি উদাহরণ:

কোড বর্ণনা
class Animal
{
public void doAnimalActions();
}class Cat extends Animal
{
public void doCatActions();
}class Tiger extends Cat
{
public void doTigerActions();
}
এখানে আমাদের তিনটি শ্রেণির ঘোষণা রয়েছে: প্রাণী, বিড়াল এবং বাঘ। বিড়াল উত্তরাধিকারসূত্রে প্রাণী। এবং টাইগার উত্তরাধিকারসূত্রে ক্যাট পেয়েছে।
public static void main(String[] args)
{
Tiger tiger = new Tiger();
Cat cat = new Tiger();
Animal animal = new Tiger();
Object obj = new Tiger();
}
একটি টাইগার অবজেক্ট সবসময় একটি ভেরিয়েবলের জন্য বরাদ্দ করা যেতে পারে যার ধরনটি তার পূর্বপুরুষদের মধ্যে একটি। বাঘ শ্রেণীর জন্য, এগুলি হল বিড়াল, প্রাণী এবং বস্তু।

এখন চওড়া এবং সংকীর্ণ রূপান্তর কটাক্ষপাত করা যাক.

যদি একটি অ্যাসাইনমেন্ট অপারেশন আমাদেরকে ইনহেরিটেন্স চেইন (অবজেক্ট ক্লাসের দিকে) নিয়ে যেতে দেয়, তাহলে আমরা একটি প্রসারিত রূপান্তর (আপকাস্টিং নামেও পরিচিত) নিয়ে কাজ করছি। যদি আমরা চেইনটিকে অবজেক্টের প্রকারের দিকে নিয়ে যাই, তাহলে এটি একটি সংকীর্ণ রূপান্তর (ডাউনকাস্টিং নামেও পরিচিত)।

উত্তরাধিকার শৃঙ্খল উপরে সরানোকে প্রশস্তকরণ বলা হয়, কারণ এটি আরও সাধারণ ধরণের দিকে নিয়ে যায়। যাইহোক, এটি করতে গিয়ে আমরা উত্তরাধিকারের মাধ্যমে ক্লাসে যোগ করা পদ্ধতিগুলিকে আহ্বান করার ক্ষমতা হারিয়ে ফেলি।

কোড বর্ণনা
public static void main(String[] args)
{
Object obj = new Tiger();
Animal animal = (Animal) obj;
Cat cat = (Cat) obj;
Tiger tiger = (Tiger) animal;
Tiger tiger2 = (Tiger) cat;
}
টাইপ সংকুচিত করার সময়, আপনাকে একটি টাইপ রূপান্তর অপারেটর ব্যবহার করতে হবে, অর্থাৎ আমরা একটি স্পষ্ট রূপান্তর করি।

এটি জাভা মেশিনকে চেক করতে দেয় যে বস্তুটি আসলেই যে ধরনের উত্তরাধিকারসূত্রে আমরা এটিকে রূপান্তর করতে চাই।

এই ছোট উদ্ভাবনটি টাইপ কাস্টিং ত্রুটির সংখ্যা বহুগুণ হ্রাস করেছে এবং জাভা প্রোগ্রামগুলির স্থিতিশীলতা উল্লেখযোগ্যভাবে বৃদ্ধি করেছে।

কোড বর্ণনা
public static void main(String[] args)
{
Object obj = new Tiger();
if (obj instanceof Cat)
{
Cat cat = (Cat) obj;
cat.doCatActions();
}}
আরও ভাল,  চেকের একটি উদাহরণ ব্যবহার করুন
public static void main(String[] args)
{
Animal animal = new Tiger();
doAllAction(animal);

Animal animal2 = new Cat();
doAllAction(animal2);

Animal animal3 = new Animal();
doAllAction(animal3);
}

public static void doAllAction(Animal animal)
{
if (animal instanceof Tiger)
{
Tiger tiger = (Tiger) animal;
tiger.doTigerActions();
}

if (animal instanceof Cat)
{
Cat cat = (Cat) animal;
cat.doCatActions();
}

animal.doAnimalActions();
}
এবং এখানে কেন. বাম দিকের উদাহরণটি দেখুন।

আমরা (আমাদের কোড) সবসময় জানি না আমরা কোন ধরনের অবজেক্ট নিয়ে কাজ করছি। এটি ভেরিয়েবল (প্রাণী) বা যেকোনো বংশধর টাইপ (বিড়াল, বাঘ) এর মতো একই ধরণের একটি বস্তু হতে পারে।

doAllAction পদ্ধতি বিবেচনা করুন। এটি পাস করা বস্তুর ধরন নির্বিশেষে সঠিকভাবে কাজ করে।

অন্য কথায়, এটি তিনটি ধরণের জন্য সঠিকভাবে কাজ করে: প্রাণী, বিড়াল এবং বাঘ।

public static void main(String[] args)
{
Cat cat = new Tiger();
Animal animal = cat;
Object obj = cat;
}
এখানে আমাদের তিনটি অ্যাসাইনমেন্ট অপারেশন আছে। এগুলি সবই প্রসারিত রূপান্তরের উদাহরণ।

টাইপ কাস্ট অপারেটর এখানে প্রয়োজন নেই, কারণ কোন চেক প্রয়োজন নেই. একটি বস্তুর রেফারেন্স সবসময় একটি ভেরিয়েবলের মধ্যে সংরক্ষণ করা যেতে পারে যার ধরনটি তার পূর্বপুরুষদের মধ্যে একটি।

"ওহ, দ্বিতীয় থেকে শেষ উদাহরণটি সবকিছু পরিষ্কার করে দিয়েছে: কেন চেক প্রয়োজন এবং কেন টাইপ কাস্টিং প্রয়োজন।"

"আমি তাই আশা করি। আমি এই সত্যের প্রতি আপনার দৃষ্টি আকর্ষণ করতে চাই:"

এর কোনোটিই কোনো বস্তুর কোনো পরিবর্তন ঘটায় না! একটি নির্দিষ্ট রেফারেন্স ভেরিয়েবলে কল করার জন্য উপলব্ধ পদ্ধতির সংখ্যা শুধুমাত্র পরিবর্তন হয় ।

উদাহরণস্বরূপ, একটি Cat ভেরিয়েবল আপনাকে doAnimalActions এবং doCatActions পদ্ধতিতে কল করতে দেয়। এটি doTigerActions পদ্ধতি সম্পর্কে কিছুই জানে না, এমনকি যদি এটি একটি টাইগার বস্তুর দিকে নির্দেশ করে।

"হ্যাঁ, আমি বুঝতে পেরেছি। আমি যা ভেবেছিলাম তার চেয়ে এটি সহজ ছিল।"