newsignifica respetar su tipo de REFERENCIA (lado izquierdo de =), ejecutando así el método de los tipos de referencia. Si el método redefinido no tiene newpalabra clave, se comporta como lo ha hecho. Además, también se conoce como herencia no polimórfica . Es decir, "Estoy creando un método completamente nuevo en la clase derivada que no tiene absolutamente nada que ver con ningún método con el mismo nombre en la clase base". - por dicho Whitaker
override, que debe usarse con la virtualpalabra clave en su clase base, significa respetar su tipo de OBJETO (lado derecho de =), ejecutando así el método reemplazado independientemente del tipo de referencia. Por otra parte, también se conoce como herencia polimórfica .
Mi manera de tener en cuenta ambas palabras clave que son opuestas entre sí.
override: la virtualpalabra clave debe definirse para anular el método. El método que utiliza la overridepalabra clave que, independientemente del tipo de referencia (referencia de la clase base o clase derivada) si se instancia con la clase base, se ejecuta el método de la clase base. De lo contrario, se ejecuta el método de clase derivada.
new: si la palabra clave es utilizada por un método, a diferencia de la overridepalabra clave, el tipo de referencia es importante. Si se instancia con clase derivada y el tipo de referencia es clase base, se ejecuta el método de clase base. Si se instancia con clase derivada y el tipo de referencia es clase derivada, se ejecuta el método de clase derivada. Es decir, es contraste de overridepalabra clave. En resumen, si olvida u omite agregar una nueva palabra clave al método, el compilador se comporta de manera predeterminada a medida que newse usa la palabra clave.
class A
{
public string Foo()
{
return "A";
}
public virtual string Test()
{
return "base test";
}
}
class B: A
{
public new string Foo()
{
return "B";
}
}
class C: B
{
public string Foo()
{
return "C";
}
public override string Test() {
return "derived test";
}
}
Llamar en principal:
A AClass = new B();
Console.WriteLine(AClass.Foo());
B BClass = new B();
Console.WriteLine(BClass.Foo());
B BClassWithC = new C();
Console.WriteLine(BClassWithC.Foo());
Console.WriteLine(AClass.Test());
Console.WriteLine(BClassWithC.Test());
Salida:
A
B
B
base test
derived test
Nuevo código de ejemplo,
Juega con el código comentando uno por uno.
class X
{
protected internal /*virtual*/ void Method()
{
WriteLine("X");
}
}
class Y : X
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Y");
}
}
class Z : Y
{
protected internal /*override*/ void Method()
{
base.Method();
WriteLine("Z");
}
}
class Programxyz
{
private static void Main(string[] args)
{
X v = new Z();
//Y v = new Z();
//Z v = new Z();
v.Method();
}