new
significa respeitar o seu tipo de referência (lado esquerdo de =
), executando assim o método dos tipos de referência. Se o método redefinido não tiver uma new
palavra-chave, ele se comportará da mesma maneira que tem. Além disso, também conhecido como herança não polimórfica . Ou seja, "estou criando um método totalmente novo na classe derivada que não tem absolutamente nada a ver com métodos com o mesmo nome na classe base". - por dito Whitaker
override
, que deve ser usado com a virtual
palavra - chave em sua classe base, significa respeitar o seu tipo OBJECT (lado direito de =
), executando o método substituído independentemente do tipo de referência. Além disso, também conhecido como herança polimórfica .
Minha maneira de ter em mente as duas palavras-chave é que elas são opostas uma à outra.
override
: virtual
palavra - chave deve ser definida para substituir o método. O método que utiliza a override
palavra-chave que, independentemente do tipo de referência (referência da classe base ou classe derivada), se for instanciado com a classe base, o método da classe base será executado. Caso contrário, o método da classe derivada será executado.
new
: se a palavra-chave for usada por um método, ao contrário da override
palavra-chave, o tipo de referência é importante. Se for instanciado com a classe derivada e o tipo de referência for a classe base, o método da classe base será executado. Se for instanciado com a classe derivada e o tipo de referência for a classe derivada, o método da classe derivada será executado. Ou seja, é contraste de override
palavra-chave. Por outro lado, se você esquecer ou omitir adicionar nova palavra-chave ao método, o compilador se comporta por padrão à medida que a new
palavra-chave é usada.
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";
}
}
Ligue para o 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());
Resultado:
A
B
B
base test
derived test
Novo exemplo de código,
Brinque com o código comentando um por um.
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();
}