Моя версия объяснения исходит из использования свойств, чтобы помочь понять различия.
override
достаточно просто, верно? Базовый тип переопределяет родительский.
new
возможно, вводит в заблуждение (для меня это было). Со свойствами это легче понять:
public class Foo
{
public bool GetSomething => false;
}
public class Bar : Foo
{
public new bool GetSomething => true;
}
public static void Main(string[] args)
{
Foo foo = new Bar();
Console.WriteLine(foo.GetSomething);
Bar bar = new Bar();
Console.WriteLine(bar.GetSomething);
}
Используя отладчик, вы можете заметить, что он Foo foo
имеет 2 GetSomething
свойства, так как на самом деле он имеет 2 версии свойства, Foo
s иBar
s, и узнать, какое из них использовать, c # «выбирает» свойство для текущего типа.
Если бы вы хотели использовать версию Bar, вы бы использовали Foo foo
вместо нее override или use .
Bar bar
имеет только 1 , так как он хочет полностью нового поведения для GetSomething
.
new
создает новый элемент с тем же именем и приводит к тому, что исходный элемент становится скрытым, в то же времяoverride
расширяется реализация для унаследованного элемента»