কম্পিউটার টিউটোরিয়াল

C#-তে মেথড ওভাররাইডিং এবং মেথড হাইডিং-এর পার্থক্য

সংজ্ঞা

  • মেথড ওভাররাইডিং (Overriding): বেস ক্লাসের virtual/abstract মেথডকে ডেরাইভড ক্লাসে override কীওয়ার্ড দিয়ে নতুন ইমপ্লিমেন্টেশন দেয়া। পলিমরফিজম অর্জন করে।
  • মেথড হাইডিং (Hiding/Shadowing): বেস ক্লাসের মেথডকে ডেরাইভড ক্লাসে new কীওয়ার্ড দিয়ে পূর্ণাঙ্গ নতুন ইমপ্লিমেন্টেশন দেয়া। পলিমরফিজম নয়।

তুলনা সারণি

বিষয়Method OverridingMethod 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

মনে রাখার মূল পয়েন্ট

  1. virtual/override: "এই মেথডটি পলিমরফিকভাবে ওভাররাইড করা যাবে"
  2. new: "এই মেথডটি বেস ক্লাসের মেথড থেকে সম্পূর্ণ আলাদা, কোনো পলিমরফিজম নেই"
  3. ভিজ্যুয়াল স্টুডিও new ছাড়া হাইডিং করলে ওয়ার্নিং দেয় (CS0108)
  4. 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() { } }
  1. C#-এ ফাংশন ওভাররাইডিং এবং মেথড হাইডিং (Shadowing) এর পার্থক্য

  2. জাভাতে ক্লাস এবং ইন্টারফেসের পার্থক্য

  3. জাভা ৮-এ ডিফল্ট এবং স্ট্যাটিক ইন্টারফেস মেথডের পার্থক্য

  4. পাইথনে মেথড এবং ফাংশনের পার্থক্য