সংজ্ঞা
- মেথড ওভাররাইডিং (Overriding): বেস ক্লাসের
virtual/abstract মেথডকে ডেরাইভড ক্লাসে override কীওয়ার্ড দিয়ে নতুন ইমপ্লিমেন্টেশন দেয়া। পলিমরফিজম অর্জন করে।
- মেথড হাইডিং (Hiding/Shadowing): বেস ক্লাসের মেথডকে ডেরাইভড ক্লাসে
new কীওয়ার্ড দিয়ে পূর্ণাঙ্গ নতুন ইমপ্লিমেন্টেশন দেয়া। পলিমরফিজম নয়।
তুলনা সারণি
| বিষয় | Method Overriding | Method Hiding |
| কীওয়ার্ড | virtual (বেস) + override (ডেরাইভড) | new (ডেরাইভড) |
| পলিমরফিজম | হ্যাঁ (রানটাইম পলিমরফিজম) | না (কম্পাইল টাইম বাইন্ডিং) |
| বেস ইমপ্লিমেন্টেশন অ্যাক্সেস | base.Method() দিয়ে সম্ভব | ডেরাইভড রেফারেন্স দিয়ে সম্ভব নয় |
| রেফারেন্স টাইপ আচরণ | বেস রেফারেন্স → ডেরাইভড অবজেক্ট = ওভাররাইডেড মেথড কল | বেস রেফারেন্স → ডেরাইভড অবজেক্ট = বেস মেথড কল |
| সিগনেচার পরিবর্তন | সম্ভব না (সেম সিগনেচার বাধ্যতামূলক) | সম্ভব (পূর্ণাঙ্গ নতুন মেথড) |
| উদ্দেশ্য | ব্যবহার প্রসারিত/পরিবর্তন | নাম সংঘর্ষ এড়ানো, লিগেসি সাপোর্ট |
উদাহরণ: ওভাররাইডিং vs হাইডিং
using System;
class Base {
public virtual void VirtualMethod() {
Console.WriteLine("Base.VirtualMethod");
}
public void NonVirtualMethod() {
Console.WriteLine("Base.NonVirtualMethod");
}
}
class Derived : Base {
// Override - পলিমরফিজম
public override void VirtualMethod() {
Console.WriteLine("Derived.VirtualMethod (Overridden)");
base.VirtualMethod(); // বেস কল করা যায়
}
// Hide - new keyword
public new void NonVirtualMethod() {
Console.WriteLine("Derived.NonVirtualMethod (Hidden)");
}
}
class Program {
static void Main() {
Derived d = new Derived();
Base b = d; // বেস রেফারেন্স, ডেরাইভড অবজেক্ট
Console.WriteLine("--- Direct Derived Reference ---");
d.VirtualMethod(); // Derived.VirtualMethod (Overridden)
d.NonVirtualMethod(); // Derived.NonVirtualMethod (Hidden)
Console.WriteLine("\n--- Base Reference to Derived Object ---");
b.VirtualMethod(); // Derived.VirtualMethod (Overridden) ← পলিমরফিজম!
b.NonVirtualMethod(); // Base.NonVirtualMethod ← হাইডিং, পলিমরফিজম নেই!
Console.ReadKey();
}
}
আউটপুট:
--- Direct Derived Reference ---
Derived.VirtualMethod (Overridden)
Derived.NonVirtualMethod (Hidden)
--- Base Reference to Derived Object ---
Derived.VirtualMethod (Overridden)
Base.NonVirtualMethod
মনে রাখার মূল পয়েন্ট
- virtual/override: "এই মেথডটি পলিমরফিকভাবে ওভাররাইড করা যাবে"
- new: "এই মেথডটি বেস ক্লাসের মেথড থেকে সম্পূর্ণ আলাদা, কোনো পলিমরফিজম নেই"
- ভিজ্যুয়াল স্টুডিও
new ছাড়া হাইডিং করলে ওয়ার্নিং দেয় (CS0108)
sealed override দিয়ে পরবর্তী ডেরাইভড ক্লাসে ওভাররাইড বন্ধ করা যায়
কখন কী ব্যবহার করবেন?
- Override: সাধারণ পলিমরফিজম, ফ্রেমওয়ার্ক এক্সটেনশন, টেমপ্লেট মেথড প্যাটার্ন
- Hide (new): থার্ড-পার্টি লাইব্রেরি ক্লাস এক্সটেন্ড করলে নাম সংঘর্ষ এড়াতে, পুরানো API বিল্ড ব্রেক ছাড়া পরিবর্তন করলে
সতর্কতা
// ❌ ভুল: virtual ছাড়া override করা যায় না
class Base { public void Foo() { } }
class Derived : Base { public override void Foo() { } } // Error
// ✅ সঠিক: virtual + override
class Base { public virtual void Foo() { } }
class Derived : Base { public override void Foo() { } }
// ✅ সঠিক: new দিয়ে হাইড (virtual ছাড়াও)
class Base { public void Foo() { } }
class Derived : Base { public new void Foo() { } }