"আমিগো, আপনি কি তিমি পছন্দ করেন?"

"তিমি? না, তাদের কথা কখনো শুনিনি।"

"এটি একটি গরুর মতো, শুধুমাত্র বড় এবং এটি সাঁতার কাটে। ঘটনাক্রমে, তিমিগুলি গরু থেকে এসেছে। আহ, বা অন্তত তারা একটি সাধারণ পূর্বপুরুষ ভাগ করে নেয়। এটা কোন ব্যাপার না।"

পলিমরফিজম এবং ওভাররাইডিং - ১

"শুনুন। আমি আপনাকে ওওপির আরেকটি শক্তিশালী টুল সম্পর্কে বলতে চাই: পলিমরফিজম । এর চারটি বৈশিষ্ট্য রয়েছে।"

1) পদ্ধতি ওভাররাইডিং।

কল্পনা করুন যে আপনি একটি গেমের জন্য একটি "গরু" ক্লাস লিখেছেন। এটা সদস্য ভেরিয়েবল এবং পদ্ধতি প্রচুর আছে. এই শ্রেণীর বস্তু বিভিন্ন জিনিস করতে পারে: হাঁটা, খাওয়া, ঘুম। গরুও হাঁটার সময় ঘণ্টা বাজে। ধরা যাক আপনি ক্লাসের সবকিছুকে ক্ষুদ্রতম বিশদে প্রয়োগ করেছেন।

পলিমরফিজম এবং ওভাররাইডিং - 2

তারপর হঠাৎ গ্রাহক বলে যে তিনি গেমের একটি নতুন স্তর প্রকাশ করতে চান, যেখানে সমস্ত ক্রিয়া সমুদ্রে সঞ্চালিত হয় এবং প্রধান চরিত্রটি একটি তিমি।

আপনি তিমি শ্রেণীর ডিজাইন করা শুরু করেছেন এবং বুঝতে পেরেছেন যে এটি গরু শ্রেণীর থেকে সামান্য ভিন্ন। উভয় শ্রেণী খুব অনুরূপ যুক্তি ব্যবহার করে, এবং আপনি উত্তরাধিকার ব্যবহার করার সিদ্ধান্ত নেন।

Cow ক্লাস আদর্শভাবে অভিভাবক শ্রেণী হতে উপযুক্ত: এটি ইতিমধ্যে সমস্ত প্রয়োজনীয় পরিবর্তনশীল এবং পদ্ধতি রয়েছে। আপনাকে যা করতে হবে তা হল তিমির সাঁতার কাটার ক্ষমতা যোগ করা। কিন্তু একটি সমস্যা আছে: আপনার তিমির পা, শিং এবং একটি ঘণ্টা আছে। সর্বোপরি, গরু শ্রেণী এই কার্যকারিতা প্রয়োগ করে। আপনি কি করতে পারেন?

পলিমরফিজম এবং ওভাররাইডিং - 3

পদ্ধতি ওভাররাইডিং উদ্ধার আসে. যদি আমরা এমন একটি পদ্ধতির উত্তরাধিকার পাই যা আমাদের নতুন ক্লাসে আমাদের যা প্রয়োজন ঠিক তা করে না, আমরা অন্য একটি পদ্ধতির সাথে প্রতিস্থাপন করতে পারি।

পলিমরফিজম এবং ওভাররাইডিং - 4

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

এখানে কিভাবে এটা কাজ করে:

কোড বর্ণনা
class Cow
{
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a cow");
}
}class Whale extends Cow
{
public void printName()
{
System.out.println("I'm a whale");
}
}
এখানে আমরা দুটি শ্রেণী সংজ্ঞায়িত করি:  Cow এবং  WhaleWhaleউত্তরাধিকারসূত্রে  Cow_

ক্লাস  পদ্ধতিটি Whale ওভাররাইড করে  printName();

public static void main(String[] args)
{
Cow cow = new Cow();
cow.printName();
}
এই কোডটি পর্দায় " আমি একটি গরু " প্রদর্শন করে।
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printName();
}
এই কোডটি পর্দায় " আমি একটি তিমি " প্রদর্শন করে

এটি উত্তরাধিকারসূত্রে Cowএবং ওভাররাইড করার পরে printName, Whaleক্লাসটিতে আসলে নিম্নলিখিত ডেটা এবং পদ্ধতি রয়েছে:

কোড বর্ণনা
class Whale
{
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a whale");
}
}
আমরা কোন পুরানো পদ্ধতি সম্পর্কে কিছুই জানি না।

"সত্যি, আমি এটাই আশা করছিলাম।"

2) কিন্তু এটাই সব নয়।

"ধরুন  Cow ক্লাসের একটি , পদ্ধতি আছে  printAllযা অন্য দুটি পদ্ধতিকে কল করে। তাহলে কোডটি এইভাবে কাজ করবে:"

পর্দা দেখাবে:
আমি সাদা
আমি একটি তিমি

কোড বর্ণনা
class Cow
{
public void printAll()
{
printColor();
printName();
}
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a cow");
}
}

class Whale extends Cow
{
public void printName()
{
System.out.println("I'm a whale");
}
}
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printAll();
}
পর্দা দেখাবে:
আমি সাদা
আমি একটি তিমি

মনে রাখবেন যে যখন Cow ক্লাসের printAll() পদ্ধতিটি তিমি বস্তুতে কল করা হয়, তখন তিমির printName() পদ্ধতি ব্যবহার করা হবে, গরুর নয়।

গুরুত্বপূর্ণ বিষয় হল পদ্ধতিটি যে ক্লাসে লেখা হয়েছে তা নয়, বরং যে বস্তুটির উপর পদ্ধতিটি বলা হয়েছে তার টাইপ (শ্রেণী)।

"আমি দেখি."

"আপনি কেবলমাত্র নন-স্ট্যাটিক পদ্ধতিগুলিকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং ওভাররাইড করতে পারেন৷ স্ট্যাটিক পদ্ধতিগুলি উত্তরাধিকারসূত্রে পাওয়া যায় না এবং তাই ওভাররাইড করা যায় না৷"

আমরা উত্তরাধিকার প্রয়োগ করার পরে এবং পদ্ধতিগুলিকে ওভাররাইড করার পরে তিমি শ্রেণীটি কেমন দেখায় তা এখানে:

কোড বর্ণনা
class Whale
{
public void printAll()
{
printColor();
printName();
}
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a whale");
}
}
আমরা উত্তরাধিকার প্রয়োগ করার পরে এবং পদ্ধতিটিকে ওভাররাইড করার পরে তিমি শ্রেণীটি কেমন দেখায় তা এখানে। আমরা কোন পুরানো printNameপদ্ধতি সম্পর্কে কিছুই জানি না।

3) টাইপ ঢালাই.

এখানে একটি এমনকি আরো আকর্ষণীয় পয়েন্ট. যেহেতু একটি ক্লাস তার প্যারেন্ট ক্লাসের সমস্ত পদ্ধতি এবং ডেটা উত্তরাধিকার সূত্রে পায়, তাই এই ক্লাসের একটি অবজেক্টকে প্যারেন্ট ক্লাসের (এবং অভিভাবকের প্যারেন্ট ইত্যাদি, অবজেক্ট ক্লাস পর্যন্ত) ভেরিয়েবল দ্বারা উল্লেখ করা যেতে পারে। এই উদাহরণ বিবেচনা করুন:

কোড বর্ণনা
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printColor();
}
পর্দা দেখাবে:
আমি সাদা।
public static void main(String[] args)
{
Cow cow = new Whale();
cow.printColor();
}
পর্দা দেখাবে:
আমি সাদা।
public static void main(String[] args)
{
Object o = new Whale();
System.out.println(o.toString());
}
স্ক্রীনটি দেখাবে:
Whale@da435a।
toString() পদ্ধতি অবজেক্ট ক্লাস থেকে উত্তরাধিকারসূত্রে প্রাপ্ত।

"ভাল জিনিস. কিন্তু কেন আপনি এটা প্রয়োজন হবে?"

"এটি একটি মূল্যবান বৈশিষ্ট্য। আপনি পরে বুঝতে পারবেন যে এটি খুব, খুব মূল্যবান।"

4) দেরী বাঁধাই (গতিশীল প্রেরণ)।

এটি দেখতে কেমন তা এখানে রয়েছে:

কোড বর্ণনা
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printName();
}
পর্দা দেখাবে:
আমি একটি তিমি।
public static void main(String[] args)
{
Cow cow = new Whale();
cow.printName();
}
পর্দা দেখাবে:
আমি একটি তিমি।

উল্লেখ্য যে এটি ভেরিয়েবলের ধরন নয় যা নির্ধারণ করে যে আমরা কোন নির্দিষ্ট প্রিন্টনাম পদ্ধতিকে কল করব (যেটি গরু বা তিমি শ্রেণীর), বরং পরিবর্তনশীল দ্বারা উল্লেখ করা বস্তুর ধরন।

গরু ভেরিয়েবল একটি তিমি বস্তুর একটি রেফারেন্স সঞ্চয় করে , এবং তিমি শ্রেণিতে সংজ্ঞায়িত printName পদ্ধতি বলা হবে।

"ঠিক আছে, তারা স্পষ্টতার জন্য এটি যোগ করেনি।"

"হ্যাঁ, এটি এতটা স্পষ্ট নয়। এই গুরুত্বপূর্ণ নিয়মটি মনে রাখবেন:"

আপনি একটি ভেরিয়েবলের উপর কল করতে পারেন এমন পদ্ধতির সেটটি ভেরিয়েবলের প্রকার দ্বারা নির্ধারিত হয়। কিন্তু কোন নির্দিষ্ট পদ্ধতি/বাস্তবায়নকে বলা হয় তা ভেরিয়েবল দ্বারা উল্লেখ করা বস্তুর ধরন/শ্রেণী দ্বারা নির্ধারিত হয়।

"আমি চেষ্টা করবো."

"আপনি ক্রমাগত এটির মধ্যে ছুটে যাবেন, তাই আপনি এটি দ্রুত বুঝতে পারবেন এবং কখনই ভুলে যাবেন না।"

5) টাইপ ঢালাই.

কাস্টিং আদিম প্রকারের তুলনায় রেফারেন্সের ধরন, অর্থাৎ ক্লাসের জন্য ভিন্নভাবে কাজ করে। যাইহোক, প্রসারিত এবং সংকীর্ণ রূপান্তরগুলি রেফারেন্স প্রকারের ক্ষেত্রেও প্রযোজ্য। এই উদাহরণ বিবেচনা করুন:

প্রসারিত রূপান্তর বর্ণনা
Cow cow = new Whale();

একটি ক্লাসিক প্রসারিত রূপান্তর. এখন আপনি শুধুমাত্র তিমি বস্তুর গরু ক্লাসে সংজ্ঞায়িত পদ্ধতি কল করতে পারেন।

কম্পাইলার আপনাকে শুধুমাত্র গরুর ধরন দ্বারা সংজ্ঞায়িত পদ্ধতিগুলিকে কল করার জন্য গরু ভেরিয়েবল ব্যবহার করতে দেবে।

সংকীর্ণ রূপান্তর বর্ণনা
Cow cow = new Whale();
if (cow instanceof Whale)
{
Whale whale = (Whale) cow;
}
একটি টাইপ চেক সহ একটি ক্লাসিক সংকীর্ণ রূপান্তর ৷ Cow টাইপের গরু ভেরিয়েবল একটি তিমি বস্তুর রেফারেন্স সঞ্চয় করে।
আমরা পরীক্ষা করি যে এটিই হয় এবং তারপরে (প্রশস্তকরণ) টাইপ রূপান্তর সম্পাদন করি। একে টাইপ কাস্টিংও বলা হয় ।
Cow cow = new Cow();
Whale whale = (Whale) cow; //exception
আপনি অবজেক্টটি টাইপ-চেক না করে একটি রেফারেন্স টাইপের একটি সংকীর্ণ রূপান্তরও করতে পারেন।
এই ক্ষেত্রে, যদি গরু ভেরিয়েবলটি তিমি বস্তু ছাড়া অন্য কিছুর দিকে নির্দেশ করে তবে একটি ব্যতিক্রম (InvalidClassCastException) নিক্ষেপ করা হবে।

6) এবং এখন সুস্বাদু কিছুর জন্য। কলিং মূল পদ্ধতি।

কখনও কখনও উত্তরাধিকারসূত্রে প্রাপ্ত পদ্ধতিকে ওভাররাইড করার সময় আপনি এটি সম্পূর্ণরূপে প্রতিস্থাপন করতে চান না। কখনও কখনও আপনি শুধু এটি একটি সামান্য বিট যোগ করতে চান.

এই ক্ষেত্রে, আপনি সত্যিই চান নতুন পদ্ধতির কোড একই পদ্ধতিতে কল করতে, কিন্তু বেস ক্লাসে। এবং জাভা এর আপনি এটি করতে দিন. এইভাবে এটি করা হয়:  super.method().

এখানে কিছু উদাহরণঃ:

কোড বর্ণনা
class Cow
{
public void printAll()
{
printColor();
printName();
}
public void printColor()
{
System.out.println("I'm white");
}
public void printName()
{
System.out.println("I'm a cow");
}
}

class Whale extends Cow
{
public void printName()
{
System.out.print("This is false: ");
super.printName();

System.out.println("I'm a whale");
}
}
public static void main(String[] args)
{
Whale whale = new Whale();
whale.printAll();
}
পর্দা দেখাবে:
আমি সাদা
এটা মিথ্যা: আমি একটি গরু
আমি একটি তিমি

"হুম। ওটা ছিল কিছু পাঠ। আমার রোবটের কান প্রায় গলে গেছে।"

"হ্যাঁ, এটি সহজ জিনিস নয়। এটি সবচেয়ে কঠিন কিছু উপাদান যা আপনি সম্মুখীন হবেন। প্রফেসর অন্য লেখকদের থেকে সামগ্রীর লিঙ্ক প্রদান করার প্রতিশ্রুতি দিয়েছেন, যাতে আপনি এখনও কিছু বুঝতে না পারলে, আপনি পূরণ করতে পারেন ফাঁক।"