Моя версия объяснения исходит из использования свойств, чтобы помочь понять различия.
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 версии свойства, Foos иBar s, и узнать, какое из них использовать, c # «выбирает» свойство для текущего типа.
Если бы вы хотели использовать версию Bar, вы бы использовали Foo fooвместо нее override или use .
Bar barимеет только 1 , так как он хочет полностью нового поведения для GetSomething.
newсоздает новый элемент с тем же именем и приводит к тому, что исходный элемент становится скрытым, в то же времяoverrideрасширяется реализация для унаследованного элемента»