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