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