পলিমর্ফিজম OOP এর একটা ফান্ডামেন্টাল মেকানিজম। জিনিসটা আমার খুবই প্যাঁচানো মনে হয় । কিন্তু এটা অনেক গুরুত্বপূর্ণ চলুন দেখি প্যাঁচ খুলতে পারি কিনা ।
পলিমর্ফিজম ২ ধরনের
পলিমর্ফিজম বুঝতে হলে Variable type, Object type, Upcasting এই টার্ম গুলার সাথে পরিচিত হতে হবে। একটা উদাহরণ থেকে দেখি, ধরুন আমাদের ৩ টা class আছে । Shape হচ্ছে সুপার ক্লাস, Rectangle আর Circle হচ্ছে Shape এর সাবক্লাস।
এখানে Shape() ক্লাসের অবজেক্ট তৈরি করে Shape type এর variable এ রাখা হয়েছে ।
এখন যদি আমরা Rectangle ক্লাসের অবজেক্ট তৈরি করে Shape type এর variable এ রাখতে চাই তাহলে কি করবো ???
খুব সিম্পল Shape rect = new Rectangle();
এখানে সাব ক্লাসের অবজেক্ট কে সুপার ক্লাসের ভেরিয়েবল টাইপে রেখেছি । আর এই ঘটনাকেই বলে upcasting । উল্টাটা কিন্তু সম্ভব না। সুপার ক্লাসের অবজেক্ট সাব ক্লাসের টাইপ রাখা যাই না।
আমরা পলিমর্ফিজম শিখে ফেলছি । পলিমর্ফিজম মানে হচ্ছে বহুরূপতা । একধরনের variable type বা reference type এ অন্য আলাদা অবজেক্ট টাইপ রাখাকেই বহুরূপতা বোঝানো হয়েছে। কোন মেথডের প্যারামিটার সুপার ক্লাসের হলে পলিমর্ফিজমের মাধ্যমে সাব ক্লাসের অবজেক্ট পাঠাতে পারি ।
Method Overloading
পলিমর্ফিজম ২ ধরনের
- Compile time Polymorphism [ achieved by Method Overloading ]
- Runtime Polymorphism [ achieved by Method Overriding ]
পলিমর্ফিজম বুঝতে হলে Variable type, Object type, Upcasting এই টার্ম গুলার সাথে পরিচিত হতে হবে। একটা উদাহরণ থেকে দেখি, ধরুন আমাদের ৩ টা class আছে । Shape হচ্ছে সুপার ক্লাস, Rectangle আর Circle হচ্ছে Shape এর সাবক্লাস।
class Shape{ } class Rectangle extends Shape{ } class Circle extends Shape{ }নিচের ছবিটা দেখুন
এখানে Shape() ক্লাসের অবজেক্ট তৈরি করে Shape type এর variable এ রাখা হয়েছে ।
এখন যদি আমরা Rectangle ক্লাসের অবজেক্ট তৈরি করে Shape type এর variable এ রাখতে চাই তাহলে কি করবো ???
খুব সিম্পল Shape rect = new Rectangle();
এখানে সাব ক্লাসের অবজেক্ট কে সুপার ক্লাসের ভেরিয়েবল টাইপে রেখেছি । আর এই ঘটনাকেই বলে upcasting । উল্টাটা কিন্তু সম্ভব না। সুপার ক্লাসের অবজেক্ট সাব ক্লাসের টাইপ রাখা যাই না।
আমরা পলিমর্ফিজম শিখে ফেলছি । পলিমর্ফিজম মানে হচ্ছে বহুরূপতা । একধরনের variable type বা reference type এ অন্য আলাদা অবজেক্ট টাইপ রাখাকেই বহুরূপতা বোঝানো হয়েছে। কোন মেথডের প্যারামিটার সুপার ক্লাসের হলে পলিমর্ফিজমের মাধ্যমে সাব ক্লাসের অবজেক্ট পাঠাতে পারি ।
Method Overloading
একই ক্লাসে, একই নামের কিন্তু প্যারামিটার সংখ্যা আলাদা বা ভিন্ন ডাটা টাইপ বিশিষ্ট একাধিক মেথড ডিক্লিয়ার করাই Method Overloading ।
Method Overriding
সুপার ক্লাস বা প্যারেন্ট ক্লাসের কোন মেথড সাব ক্লাস বা চাইল্ড ক্লাসে নতুন করে ডিক্লিয়ার করাই Method Overriding ।
এখন যদি আমি upcasting করে Rectangle এর অবজেক্ট তৈরি করে Shape এর মধ্যে রাখি
মেথড ওভাররাইড হয় কিন্তু ক্লাসের ডাটা মেম্বার হয়না ।
class Shape{ float area(int a){ System.out.println("Area of the circle"); return (float) (3.1416*a*a); } float area(int a, int b){ System.out.println("Area of the rectangle"); return a*b; } }দেখুন উপরের Shape class এ area() নামের দুটি মেথড আছে কিন্তু তাদের প্যারামিটারের সংখ্যা ভিন্ন । area(int a) একটা প্যারামিটার নিয়ে Circle এর ক্ষেত্রফল রিটার্ন করছে এবং area(int a, int b) দুটি প্যারামিটার নিয়ে Rectangle এর ক্ষেত্রফল রিটার্ন করছে ।
public static void main(String[] args) { Shape shape = new Shape(); System.out.println(shape.area(5)); // for circle
System.out.println(shape.area(5,6)); // for rectangle
}এখন Shape class এর অবজেক্ট তৈরি করে ইচ্ছামতো প্যারামিটার সেট করে মেথড কল করলে Compiler Shape class থেকে খুঁজে ঐ প্যারামিটার বিশিষ্ট মেথডের সাথে বাউন্ড করে দিবে । আর খুঁজে না পেলে error দেখাবে । এইটাই Compile time Polymorphism ।
Method Overriding
সুপার ক্লাস বা প্যারেন্ট ক্লাসের কোন মেথড সাব ক্লাস বা চাইল্ড ক্লাসে নতুন করে ডিক্লিয়ার করাই Method Overriding ।
class Shape{ void draw(){ System.out.println("drawing..."); } }
class Rectangle extends Shape{ void draw(){ System.out.println("drawing rectangle..."); } }
class Circle extends Shape{ void draw(){ System.out.println("drawing circle..."); } }উপরের কোডে দেখুন সুপার ক্লাসের draw() মেথড সাব ক্লাস গুলো ডিক্লিয়ার করে যার যার মতো ইমপ্লিমেন্ট করেছে । এটাই Method Override । তাহলে বোঝা যাচ্ছে Method Overriding এর জন্য ইনহেরিটেন্স মাস্ট ।
এখন যদি আমি upcasting করে Rectangle এর অবজেক্ট তৈরি করে Shape এর মধ্যে রাখি
Shape rect = new Rectangle();
তাহলে এটাই হবে Runtime Polymorphism ।
যেহেতু সাব ক্লাস সুপার ক্লাসের মেথড Override করে এবং সাব ক্লাসের অবজেক্ট সুপার ক্লাসের ভেরিয়েবল টাইপে রেখে ঐ মেথড কল করা হয়
rect.draw();
এজন্য এই মেথড Runtime এ invoke হয় । তাই এটা Runtime Polymorphism । মেথড ওভাররাইড হয় কিন্তু ক্লাসের ডাটা মেম্বার হয়না ।
class Shape { int area=50; }
class Rectangle extends Shape{ int area = 30; } class Circle extends Shape{ int area = 70; }
public class Test{ public static void main(String[] args) { Shape rect = new Rectangle();
Shape circle = new Circle(); System.out.println(rect.area); System.out.println(circle.area); } }আউটপুটঃ
Rectangle area is 50 Circle area is 50
area প্রতিক্ষেত্রেই 50 । তার মানে ডাটা মেম্বার ওভাররাইড হয়না ।
THE END
Polymorphism | Method Overloading & Overriding
Reviewed by hnjaman
on
June 22, 2018
Rating:
No comments: