Sobes.tech
Middle

Mi a különbség a metódusok felülírása és elrejtése között C#-ban?

sobes.tech MI

Válasz az MI-től

A felülírás (override) a polimorfizmus megvalósítására szolgál, lehetővé téve, hogy az örökölt osztály saját megvalósítást adjon egy virtuális, absztrakt vagy örökölt módszerhez. A virtual kulcsszó az alap osztályban és az override a leszármazott osztályban kötelező.

A rejtés (hiding, shadowing) egy ugyanazzal a névvel rendelkező módszerrel történik a leszármazott osztályban, amely elrejti az alap osztály módszerét. Az alap osztály módszere megmarad, de az eléréséhez az örökölt példányból expliciten kell típuscastolni vagy a base kulcsszót használni. A new kulcsszót a leszármazott osztályban használjuk.

Jellemző Felülírás (Override) Rejtés (Hiding)
Kulcsszó virtual (alap), override (örökölt) new (örökölt)
Polimorfizmus Igen, a leszármazott osztály megvalósítása hívódik Nem, a hívás a referencia típusától függ
Hívás referencia alapján A felülírt módszer hívódik a leszármazottból Az alap osztály módszere hívódik
Hozzáférés az alap osztály módszeréhez base.MethodName()-en keresztül base.MethodName()-en vagy típuscastolással
public class BaseClass
{
    public virtual void ShowMessage() // Virtuális módszer felülíráshoz
    {
        Console.WriteLine("Üzenet a BaseClass-tól (virtuális)." );
    }

    public void DisplayInfo() // Rejtéshez
    {
        Console.WriteLine("Információ a BaseClass-tól.");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage() // Virtuális módszer felülírása
    {
        Console.WriteLine("Üzenet a DerivedClass-tól (override)." );
    }

    public new void DisplayInfo() // Rejtés
    {
        Console.WriteLine("Információ a DerivedClass-tól (new)." );
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        BaseClass baseObj = new BaseClass();
        DerivedClass derivedObj = new DerivedClass();
        BaseClass derivedAsBase = new DerivedClass(); // Bázistípusú referencia egy származott objektumra

        baseObj.ShowMessage();     // Kimenet: Üzenet a BaseClass-tól (virtuális).
        baseObj.DisplayInfo();     // Kimenet: Információ a BaseClass-tól.

        derivedObj.ShowMessage();  // Kimenet: Üzenet a DerivedClass-tól (override).
        derivedObj.DisplayInfo();  // Kimenet: Információ a DerivedClass-tól (new).

        derivedAsBase.ShowMessage(); // Kimenet: Üzenet a DerivedClass-tól (override). (Polimorfizmus működésben)
        derivedAsBase.DisplayInfo(); // Kimenet: Információ a BaseClass-tól. (A BaseClass módszere hívódik a referencia típus miatt)
    }
}