Method Overloading এবং Method Overriding

১. Method Overloading (মেথড ওভারলোডিং)

একই ক্লাসের মধ্যে একই নামের একাধিক মেথড থাকলে কিন্তু তাদের প্যারামিটার (Parameters) ভিন্ন হলে তাকে মেথড ওভারলোডিং বলে।

  • উদ্দেশ্য: একই কাজ ভিন্ন ভিন্ন ইনপুট দিয়ে করার জন্য এটি ব্যবহৃত হয়।
  • কখন ঘটে: এটি Compile-time এ ঘটে (একে Static Polymorphism বলা হয়)।
  • শর্ত: মেথডের নাম এক হতে হবে, কিন্তু প্যারামিটারের সংখ্যা বা টাইপ অবশ্যই আলাদা হতে হবে।

উদাহরণ: একটি add() মেথড যা দুটি সংখ্যা যোগ করে, আবার অন্য একটি add() মেথড যা তিনটি সংখ্যা যোগ করে।

১. Method Overloading এর উদাহরণ

এখানে একই ক্লাসের ভেতর multiply নামের দুটি মেথড আছে, কিন্তু তাদের প্যারামিটার আলাদা।

class Calculator {

// দুটি সংখ্যার গুণফল

int multiply(int a, int b) {

     return a * b;

}

// তিনটি সংখ্যার গুণফল (মেথড ওভারলোডেড)

int multiply(int a, int b, int c) {

     return a * b * c;

}

}

public class Main {

public static void main(String[] args) {

     Calculator obj = new Calculator();

     System.out.println(obj.multiply(5, 4));    // আউটপুট: 20

     System.out.println(obj.multiply(5, 4, 2)); // আউটপুট: 40

}

}

Method Overloading (ব্যাংকিং সিস্টেমের উদাহরণ)

একটি ব্যাংকিং সফটওয়্যারে টাকা জমা দেওয়ার (Deposit) প্রক্রিয়াটি ওভারলোডিংয়ের একটি চমৎকার উদাহরণ হতে পারে। একজন গ্রাহক ক্যাশ টাকা জমা দিতে পারেন, আবার অন্য একজন চেক দিয়ে জমা দিতে পারেন।

class Bank {

// শুধুমাত্র টাকা জমা দেওয়া (Cash Deposit)

void deposit(int amount) {

     System.out.println(amount + " টাকা ক্যাশ জমা হয়েছে।");

}

// চেক নাম্বারসহ টাকা জমা দেওয়া (Check Deposit - Overloaded)

void deposit(int amount, String checkNumber) {

     System.out.println(amount + " টাকা চেক (No: " + checkNumber + ") এর মাধ্যমে জমা হয়েছে।");

}

}

এখানে কী ঘটল? মেথডের নাম একই (deposit), কিন্তু ইনপুট আলাদা (একটি শুধু সংখ্যা নেয়, অন্যটি সংখ্যা ও টেক্সট দুটোই নেয়)। এটিই ওভারলোডিং।

২. Method Overriding (মেথড ওভাররাইডিং)

যখন চাইল্ড ক্লাসে (Subclass) প্যারেন্ট ক্লাসের (Superclass) সমান নামের এবং সমান প্যারামিটারের একটি মেথড পুনরায় লেখা হয়, তখন তাকে মেথড ওভাররাইডিং বলে।

  • উদ্দেশ্য: প্যারেন্ট ক্লাসের কোনো মেথডকে চাইল্ড ক্লাসে নিজের মতো করে নতুন রূপ দেওয়ার জন্য এটি ব্যবহৃত হয়।
  • কখন ঘটে: এটি Run-time এ ঘটে (একে Dynamic Polymorphism বলা হয়)।
  • শর্ত: মেথডের নাম, প্যারামিটার এবং রিটার্ন টাইপ—সবকিছু হুবহু এক হতে হবে।

উদাহরণ: প্যারেন্ট ক্লাস Animal এর একটি মেথড আছে makeSound()। চাইল্ড ক্লাস Dog সেই মেথডটিকে ওভাররাইড করে শব্দ হিসেবে "Bark" সেট করলো।

Method Overriding এর উদাহরণ

এখানে Animal ক্লাসের মেথডকে Dog ক্লাসে নতুন করে ডিফাইন বা ওভাররাইড করা হয়েছে।

class Animal {

void makeSound() {

     System.out.println("প্রাণীটি শব্দ করছে");

}

}

class Dog extends Animal {

// প্যারেন্ট ক্লাসের মেথডকে ওভাররাইড করা হলো

@Override

void makeSound() {

     System.out.println("কুকুরটি ঘেউ ঘেউ করছে");

}

}

public class Main {

public static void main(String[] args) {

     Animal myAnimal = new Animal();

    Animal myDog = new Dog();

     myAnimal.makeSound(); // আউটপুট: প্রাণীটি শব্দ করছে

     myDog.makeSound(); // আউটপুট: কুকুরটি ঘেউ ঘেউ করছে (ওভাররাইডেড মেথড কল হবে)

}

}

Method Overriding (ট্যাক্স গণনার উদাহরণ)

সব ব্যাংকের জন্য সুদের হার বা ট্যাক্স গণনার একটি সাধারণ নিয়ম থাকে, কিন্তু নির্দিষ্ট কিছু ব্যাংক (যেমন- ইসলামি ব্যাংক বা বিশেষায়িত ব্যাংক) সেই নিয়মটি পরিবর্তন করে নিজেদের মতো করে সেট করে।

class GeneralBank {

void calculateTax() {

     System.out.println("সাধারণ ট্যাক্স হার: ১৫%");

}

}

class IslamicBank extends GeneralBank {

// প্যারেন্ট ক্লাসের মেথডকে নিজের মতো করে পরিবর্তন (Override)

@Override

void calculateTax() {

     System.out.println("বিশেষ ট্যাক্স হার: ১০%");

}

}

এখানে কী ঘটল? IslamicBank ক্লাসটি তার প্যারেন্ট ক্লাসের calculateTax মেথডটি উত্তরাধিকার সূত্রে পেয়েছিল, কিন্তু সেটিকে হুবহু ব্যবহার না করে নিজের মতো করে "ওভাররাইড" বা প্রতিস্থাপন করেছে।

পার্থক্য টেবিল (At a Glance)

বৈশিষ্ট্য

Method Overloading

Method Overriding

ক্লাস

একই ক্লাসের মধ্যে ঘটে।

দুটি ক্লাসের (প্যারেন্ট ও চাইল্ড) মধ্যে ঘটে।

প্যারামিটার

অবশ্যই ভিন্ন হতে হবে।

অবশ্যই একই হতে হবে।

Binding

Static বা Compile-time এ হয়।

Dynamic বা Run-time এ হয়।

Inheritance

ইনহেরিটেন্সের প্রয়োজন নেই।

ইনহেরিটেন্স বা উত্তরাধিকার আবশ্যক।

উদ্দেশ্য

কোডের রিডাবিলিটি বা পঠনযোগ্যতা বাড়াতে।

মেথডের সুনির্দিষ্ট বাস্তবায়ন বা Implementation দিতে।

 সহজ কথায় মনে রাখার উপায়:

  • Overloading: নাম এক, কিন্তু কাজ (প্যারামিটার) আলাদা। (যেমন: একই মানুষ ভিন্ন ভিন্ন ওজনের ব্যাগ বইছে)।
  • Overriding: নাম এবং কাজ সব এক, কিন্তু করার ধরন আলাদা। (যেমন: বাবা যেভাবে হাঁটেন, সন্তান তার চেয়ে ভিন্নভাবে বা দ্রুত হাঁটে)।

মূল পার্থক্যগুলো একনজরে:

  • Overloading: আপনি যখন একই টুল (মেথড) দিয়ে ভিন্ন ভিন্ন ডাটা প্রসেস করতে চান। এটি একই ক্লাসে থাকে।
  • Overriding: যখন চাইল্ড ক্লাস তার প্যারেন্ট ক্লাসের দেওয়া কোনো মেথড বা আচরণ পরিবর্তন করতে চায়। এটি ইনহেরিটেন্স বা চাইল্ড ক্লাসে থাকে।

Method Overloading এবং Method Overriding এর মধ্যকার পার্থক্য নিম্নরূপ:

Method Overloading

Method Overriding

Method overloading হচ্ছে কম্পাইল টাইম পলিমরফিজম।Method overriding হচ্ছে রান টাইম পলিমরফিজম।
একই ক্লাসের মধ্যে হয়।দুইটি ক্লাসের মধ্যে হয় inheritance সম্পর্কের মাধ্যমে।
Method overloading এ inheritance ব্যবহার হতেও পারে নাও হতে পারে।Method overriding এ inheritance অবশ্যই ব্যবহার হবে।
Method overloading এ দুই মেথডের নাম একই কিন্তু প্যারামিটারগুলোর সংখ্যা, টাইপ আলাদা হয়।Method overriding এ দুই মেথডের নাম এবং প্যারামিটারগুলোর সংখ্যা, টাইপ একই হয়।
অভারলোডেড মেথডে স্ট্যাটিক বাইন্ডিং ব্যবহার করা হয়।অভারিডেড মেথডে ডায়নামিক বাইন্ডিং ব্যবহার করা হয়।
কম্পাইল টাইম পলিমরফিজম এর জন্য এর কার্যকারিতা খুবই কম।এর কার্যকারিতা তুলনামূলক বেশী।
প্রাইভেট এবং ফাইনাল মেথড overloaded করা সম্ভব।প্রাইভেট এবং ফাইনাল মেথড overloaded করা সম্ভব নয়।

নোটঃ শুধু পার্থক্য আসলে কোড দেয়া লাগবেনা। কিন্তু উদাহরণ লিখতে বলা হলে তখন কোড লিখতে হবে।