Назад к вопросам
Middle
166
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech 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 вызван из-за типа ссылки)
    }
}