TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.76K subscribers
Post #1494 1.46K
День 1209. #ЗаметкиНаПолях
Полиморфизм в C#: Override и New
В чём разница между созданием виртуального/переопределяемого метода и простым сокрытием метода с помощью ключевого слова new в C#?

Во-первых, в отличие от переопределения, при использовании ключевого слова new вы можете изменить тип возвращаемого значения. Однако, это ещё не всё.

Допустим, у нас есть родительский класс и два потомка. Один потомок использует override, другой – new:
class Parent
{
public virtual void WhoAmI() =>
Console.WriteLine("Parent");
}

class Child : Parent
{
public override void WhoAmI() =>
Console.WriteLine("Child");
}

class ChildNew : Parent
{
public new void WhoAmI() =>
Console.WriteLine("ChildNew");
}

Тогда что выведет следующий код?
Parent child = new Child();
child.WhoAmI();

Parent childNew = new ChildNew();
childNew.WhoAmI();

На первый взгляд кажется, что в обоих случаях случае он выведет одно и то же. В конце концов, в обоих случаях производный тип приводится к родительскому. При таком кастинге важно учитывать, что объект «всегда помнит, кто он». То есть Child можно привести к Parent или даже к object, и он всё равно помнит, что он Child. Так что же выведет код выше?
Child
Parent

Итак, Child с переопределённым методом запомнил, кто он есть, и, следовательно, был вызван тот же метод WhoAmI(), но переопределённый. В случае с ChildNew… это не совсем так. На самом деле, если подумать, объяснение довольно простое. Когда вы используете ключевое слово override, оно переопределяет базовый класс, и между двумя методами существует своего рода «связь». То есть известно, что дочерний член является переопределением базового.

Когда вы используете ключевое слово new, вы говорите, что эти два метода никак не связаны между собой. И что ваш новый метод существует только в дочернем классе, но не в родительском. Между ними нет «связи». Поэтому при приведении к родительскому классу переопределённый метод известен, а «новый» метод — нет.

Ключевое слово new полезно в некоторых исключительных случаях, например, для переопределения (скрытия) методов сторонних библиотек. Однако, в своей иерархии наследования его использовать не стоит. Мало того, что для этого очень мало причин, так ещё и нарушается принцип подстановки Лисков.

Источник: https://dotnetcoretutorials.com/2022/05/13/override-vs-new-polymorphism-in-c-net/
  • 👍 16
More from @netdeveloperdiary
  1. Oct 14, 2026Post #3373
  2. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  3. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  4. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
  5. Oct 10, 2026День 2810. #ЧтоНовенького #VSCode Более Быстрый и Лёгкий C# Dev Kit Мы, разработчики, люби…
  6. Oct 9, 2026День 2809. #Карьера 5 Навыков, Которые Помогут Быстрее Стать Сеньором. Окончание Начало 3.…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →