Mi manera de tener en cuenta tanto las palabras clave que son opuestos el uno del otro.
override
: virtual
se debe definir la palabra clave para anular el método. El método que utiliza la palabra clave override
independientemente del tipo de referencia (referencia de la clase base o de la clase derivada) si se crea una instancia con la clase base, se ejecuta el método de la clase base. De lo contrario, se ejecuta el método de la clase derivada.
new
: si la palabra clave es utilizada por un método, a diferencia de la palabra clave override
, el tipo de referencia es importante. Si se crea una 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. A saber, es el contraste de la palabra clave override
. En passant, si olvida u omite agregar una palabra clave nueva al método, el compilador se comporta de manera predeterminada como se usa la palabra clave new
.
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";
}
}
de llamadas en el 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
duplicados de muchas preguntas, incluyendo http://stackoverflow.com/questions/159978/c-keyword-usage-virtualoverride-vs-new –