Mi versión de la explicación proviene del uso de propiedades para ayudar a comprender las diferencias.
override
es lo suficientemente simple, ¿verdad? El tipo subyacente anula el del padre.
new
es quizás el engañoso (para mí lo fue). Con propiedades es más fácil de entender:
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);
}
Al usar un depurador puede notar que Foo foo
tiene 2 GetSomething
propiedades, ya que en realidad tiene 2 versiones de la propiedad, Foo
'sy Bar
', y para saber cuál usar, c # "selecciona" la propiedad para el tipo actual.
Si quisieras usar la versión de la barra, hubieras usado anular o usar Foo foo
en su lugar.
Bar bar
tiene solo 1 , ya que quiere un comportamiento completamente nuevo para GetSomething
.
new
crea un nuevo miembro con el mismo nombre y hace que el miembro original se oculte, mientrasoverride
extiende la implementación para un miembro heredado"