Middle
Aký je rozdiel medzi prepísaním a skrytím metód v C#?
sobes.tech AI
Odpoveď od AI
Prekreslenie (override) sa používa na implementáciu polymorfizmu, umožňujúc odvodenej triede poskytnúť vlastnú implementáciu virtuálnej, abstraktnej alebo zdedené metódy. Kľúčové slovo virtual v základnej triede a override v odvodenom sú povinné.
Skrytie (hiding, shadowing) metódou s rovnakým menom v odvodenom triede od metódy v základnej triede. Metóda základnej triedy zostáva zachovaná, ale k nej je prístup cez explicitné pretypovanie alebo kľúčové slovo base. Používa sa kľúčové slovo new v odvodenom.
| Vlastnosť | Prepisovanie (Override) | Skrytie (Hiding) |
|---|---|---|
| Kľúčové slovo | virtual (základná), override (odvodná) |
new (odvodná) |
| Polymorfizmus | Áno, volá sa implementácia odvodeného objektu | Nie, volá sa implementácia podľa typu odkazu |
| Volanie cez odkaz na základný typ | Volá sa prepísaná metóda odvodeného objektu | Volá sa metóda základného objektu |
| Prístup k metóde základného objektu | Cez base.MethodName() |
Cez base.MethodName() alebo pretypovanie |
public class BaseClass
{
public virtual void ShowMessage() // Virtuálna metóda na prepísanie
{
Console.WriteLine("Message from BaseClass (virtual).");
}
public void DisplayInfo() // Metóda na skrytie
{
Console.WriteLine("Info from BaseClass.");
}
}
public class DerivedClass : BaseClass
{
public override void ShowMessage() // Prepisovanie virtuálnej metódy
{
Console.WriteLine("Message from DerivedClass (override).");
}
public new void DisplayInfo() // Skrytie metódy
{
Console.WriteLine("Info from DerivedClass (new).");
}
}
public class Program
{
public static void Main(string[] args)
{
BaseClass baseObj = new BaseClass();
DerivedClass derivedObj = new DerivedClass();
BaseClass derivedAsBase = new DerivedClass(); // Referencia na základný typ na objekt odvodenej triedy
baseObj.ShowMessage(); // Výstup: Message from BaseClass (virtual).
baseObj.DisplayInfo(); // Výstup: Info from BaseClass.
derivedObj.ShowMessage(); // Výstup: Message from DerivedClass (override).
derivedObj.DisplayInfo(); // Výstup: Info from DerivedClass (new).
derivedAsBase.ShowMessage(); // Výstup: Message from DerivedClass (override). (Polymorfizmus v akcii)
derivedAsBase.DisplayInfo(); // Výstup: Info from BaseClass. (Metóda BaseClass volaná kvôli typu odkazu)
}
}