Назад к вопросам
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 вызван из-за типа ссылки)
}
}