Polymorphism | Method Overloading & Overriding

পলিমর্ফিজম OOP এর একটা ফান্ডামেন্টাল মেকানিজম। জিনিসটা আমার খুবই প্যাঁচানো মনে হয় । কিন্তু এটা অনেক গুরুত্বপূর্ণ চলুন দেখি প্যাঁচ খুলতে পারি কিনা ।
পলিমর্ফিজম ২ ধরনের
  1. Compile time Polymorphism   [ achieved by Method Overloading ]
  2. Runtime Polymorphism           [ achieved by Method Overriding ]
থার্ড ব্রাকেটের লেখা আপাতত ইগনোর করে Compile time, Runtime কি জিনিস দেখে আসুন এই লিঙ্ক থেকে ।
পলিমর্ফিজম বুঝতে হলে 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 ।
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 Polymorphism | Method Overloading & Overriding Reviewed by hnjaman on June 22, 2018 Rating: 5

No comments:

Powered by Blogger.