Sobes.tech
Middle

Jaka jest różnica między nadpisywaniem a ukrywaniem metod w C#?

sobes.tech AI

Odpowiedź od AI

Przesłanianie (override) jest używane do implementacji polimorfizmu, umożliwiając klasie dziedziczącej dostarczenie własnej implementacji metody wirtualnej, abstrakcyjnej lub odziedziczonej. Słowo kluczowe virtual w klasie bazowej i override w klasie pochodnej są obowiązkowe.

Ukrywanie (hiding, shadowing) odbywa się przez metodę o tej samej nazwie w klasie pochodnej, która ukrywa metodę klasy bazowej. Metoda klasy bazowej jest zachowana, ale dostęp do niej z instancji klasy pochodnej odbywa się przez jawne rzutowanie lub słowo kluczowe base. W klasie pochodnej używa się słowa kluczowego new.

Cecha Przesłanianie (Override) Ukrywanie (Hiding)
Słowo kluczowe virtual (bazowa), override (pochodna) new (pochodna)
Polimorfizm Tak, wywoływana jest implementacja klasy pochodnej Nie, wywoływana jest implementacja w zależności od typu referencji
Wywołanie przez referencję typu bazowego Wywoływana jest przesłonięta metoda klasy pochodnej Wywoływana jest metoda klasy bazowej
Dostęp do metody klasy bazowej Przez base.MethodName() Przez base.MethodName() lub rzutowanie typu
public class BaseClass
{
    public virtual void ShowMessage() // Wirtualna metoda do przesłonięcia
    {
        Console.WriteLine("Wiadomość z BaseClass (wirtualna).");
    }

    public void DisplayInfo() // Metoda do ukrycia
    {
        Console.WriteLine("Informacja z BaseClass.");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage() // Przesłonięcie metody wirtualnej
    {
        Console.WriteLine("Wiadomość z DerivedClass (override).");
    }

    public new void DisplayInfo() // Ukrycie metody
    {
        Console.WriteLine("Informacja z DerivedClass (new).");
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        BaseClass baseObj = new BaseClass();
        DerivedClass derivedObj = new DerivedClass();
        BaseClass derivedAsBase = new DerivedClass(); // Referencja typu bazowego do obiektu pochodnego

        baseObj.ShowMessage();     // Wyjście: Wiadomość z BaseClass (wirtualna).
        baseObj.DisplayInfo();     // Wyjście: Informacja z BaseClass.

        derivedObj.ShowMessage();  // Wyjście: Wiadomość z DerivedClass (override).
        derivedObj.DisplayInfo();  // Wyjście: Informacja z DerivedClass (new).

        derivedAsBase.ShowMessage(); // Wyjście: Wiadomość z DerivedClass (override). (Polimorfizm w akcji)
        derivedAsBase.DisplayInfo(); // Wyjście: Informacja z BaseClass. (Metoda klasy bazowej wywołana na podstawie typu referencji)
    }
}