Il mio modo di tenere a mente due parole chiave che sono opposti l'uno dall'altro.
override
: virtual
la parola chiave deve essere definita per sovrascrivere il metodo. Il metodo che usa la parola chiave override
indipendentemente dal tipo di riferimento (riferimento di classe base o classe derivata) se è istanziato con la classe base, il metodo di esecuzione della classe base. Altrimenti, il metodo delle esecuzioni di classi derivate.
new
: se la parola chiave viene utilizzata da un metodo, a differenza della parola chiave override
, il tipo di riferimento è importante. Se viene creata un'istanza con la classe derivata e il tipo di riferimento è la classe base, viene eseguito il metodo della classe base. Se viene creata un'istanza con la classe derivata e il tipo di riferimento è una classe derivata, viene eseguito il metodo della classe derivata. Vale a dire, è il contrasto della parola chiave override
. En passant, se si dimentica o omette di aggiungere una nuova parola chiave al metodo, il compilatore si comporta di default con la parola chiave 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";
}
}
Chiamata in principale:
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());
uscita:
A
B
B
base test
derived test
duplicato di molte questioni, tra cui http://stackoverflow.com/questions/159978/c-keyword-usage-virtualoverride-vs-new –