Sobes.tech
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)
    }
}