new
significa 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 new
palabra 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 virtual
palabra 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 virtual
palabra clave debe definirse para anular el método. El método que utiliza la override
palabra 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 override
palabra 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 override
palabra 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 new
se 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();
}