Sobes.tech
Middle

Каква е разликата между презаписването и скриването на методи в C#?

sobes.tech AI

Отговор от AI

Презаписването (override) се използва за реализиране на полиморфизъм, като позволява на наследения клас да предостави своя собствена реализация на виртуален, абстрактен или наследен метод. Ключовата дума virtual в базовия клас и override в наследника са задължителни.

Скриването (hiding, shadowing) на метод със същото име в наследения клас от метода в базовия клас. Методът на базовия клас остава наличен, но до него се достига чрез явен кастинг или ключовата дума base. Използва се ключовата дума new в наследника.

Признак Презаписване (Override) Скриване (Hiding)
Ключова дума virtual (базов), override (наследник) new (наследник)
Полиморфизъм Да, се извиква реализацията на наследника Не, се извиква реализацията според типа на референцията
Вика по референция към базов тип Вика се презаписаният метод на наследника Вика се методът на базовия клас
Достъп до метод на базовия клас Чрез base.MethodName() Чрез base.MethodName() или кастинг
public class BaseClass
{
    public virtual void ShowMessage() // Виртуален метод за презаписване
    {
        Console.WriteLine("Message from BaseClass (virtual).");
    }

    public void DisplayInfo() // Метод за скриване
    {
        Console.WriteLine("Info from BaseClass.");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage() // Презаписване на виртуалния метод
    {
        Console.WriteLine("Message from DerivedClass (override).");
    }

    public new void DisplayInfo() // Скриване на метода
    {
        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(); // Откъс към базов тип към обект от наследник

        baseObj.ShowMessage();     // Извежда: Message from BaseClass (virtual).
        baseObj.DisplayInfo();     // Извежда: Info from BaseClass.

        derivedObj.ShowMessage();  // Извежда: Message from DerivedClass (override).
        derivedObj.DisplayInfo();  // Извежда: Info from DerivedClass (new).

        derivedAsBase.ShowMessage(); // Извежда: Message from DerivedClass (override). (Полиморфизъм в действие)
        derivedAsBase.DisplayInfo(); // Извежда: Info from BaseClass. (Методът на BaseClass е извикан заради типа на референцията)
    }
}