Middle
Care este diferența dintre suprascrierea și ascunderea metodelor în C#?
sobes.tech AI
Răspuns de la AI
Suprascrierea (override) este utilizată pentru implementarea polimorfismului, permițând clasei derivate să furnizeze propria sa implementare a unei metode virtuale, abstracte sau moștenite. Cuvântul cheie virtual în clasa de bază și override în cea derivată sunt obligatorii.
Ascunderea (hiding, shadowing) se face printr-o metodă cu același nume în clasa derivată care ascunde metoda din clasa de bază. Metoda clasei de bază rămâne păstrată, dar accesul la ea dintr-o instanță a clasei derivate se face printr-un cast explicit sau cuvântul cheie base. Se folosește new în clasa derivată.
| Caracteristică | Suprascriere (Override) | Ascundere (Hiding) |
|---|---|---|
| Cuvânt cheie | virtual (de bază), override (derivat) |
new (derivat) |
| Polimorfism | Da, se apelează implementarea clasei derivate | Nu, se apelează implementarea în funcție de tipul referinței |
| Apel după referință de tip bază | Se apelează metoda suprascrisă a clasei derivate | Se apelează metoda clasei de bază |
| Acces la metoda clasei de bază | Prin base.MethodName() |
Prin base.MethodName() sau cast de tip |
public class BaseClass
{
public virtual void ShowMessage() // Metodă virtuală pentru suprascriere
{
Console.WriteLine("Mesaj de la BaseClass (virtual).");
}
public void DisplayInfo() // Metodă pentru ascundere
{
Console.WriteLine("Informație de la BaseClass.");
}
}
public class DerivedClass : BaseClass
{
public override void ShowMessage() // Suprascrierea metodei virtuale
{
Console.WriteLine("Mesaj de la DerivedClass (override).");
}
public new void DisplayInfo() // Ascunderea metodei
{
Console.WriteLine("Informație de la DerivedClass (new).");
}
}
public class Program
{
public static void Main(string[] args)
{
BaseClass baseObj = new BaseClass();
DerivedClass derivedObj = new DerivedClass();
BaseClass derivedAsBase = new DerivedClass(); // Referință de tip bază la un obiect derivat
baseObj.ShowMessage(); // Ieșire: Mesaj de la BaseClass (virtual).
baseObj.DisplayInfo(); // Ieșire: Informație de la BaseClass.
derivedObj.ShowMessage(); // Ieșire: Mesaj de la DerivedClass (override).
derivedObj.DisplayInfo(); // Ieșire: Informație de la DerivedClass (new).
derivedAsBase.ShowMessage(); // Ieșire: Mesaj de la DerivedClass (override). (Polimorfism în acțiune)
derivedAsBase.DisplayInfo(); // Ieșire: Informație de la BaseClass. (Metoda de la BaseClass a fost apelată din cauza tipului de referință)
}
}