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)
}
}