new
significa rispettare il tipo di RIFERIMENTO (lato sinistro di =
), eseguendo quindi il metodo dei tipi di riferimento. Se il metodo ridefinito non ha una new
parola chiave, si comporta come ha fatto. Inoltre, è noto anche come eredità non polimorfica . Cioè, "Sto creando un metodo nuovissimo nella classe derivata che non ha assolutamente nulla a che fare con alcun metodo con lo stesso nome nella classe base." - disse Whitaker
override
, che deve essere utilizzato con la virtual
parola chiave nella sua classe di base, significa rispettare il tipo di OGGETTO (lato destro di =
), eseguendo quindi il metodo overriden indipendentemente dal tipo di riferimento. Inoltre, è noto anche come eredità polimorfica .
Il mio modo di tenere a mente entrambe le parole chiave sono opposte.
override
: la virtual
parola chiave deve essere definita per sovrascrivere il metodo. Il metodo utilizza una override
parola chiave che, indipendentemente dal tipo di riferimento (riferimento della classe base o della classe derivata) se viene istanziata con la classe base, viene eseguito il metodo della classe base. Altrimenti, viene eseguito il metodo di classe derivata.
new
: se la parola chiave viene utilizzata da un metodo, diversamente dalla override
parola chiave, il tipo di riferimento è importante. Se viene istanziato con la classe derivata e il tipo di riferimento è la classe base, viene eseguito il metodo della classe base. Se viene istanziato con la classe derivata e il tipo di riferimento è la classe derivata, viene eseguito il metodo della classe derivata. Vale a dire, è il contrasto della override
parola chiave. Di fatto, se si dimentica o si omette di aggiungere una nuova parola chiave al metodo, il compilatore si comporta di default quando new
viene utilizzata la parola chiave.
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";
}
}
Chiama 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());
Produzione:
A
B
B
base test
derived test
Nuovo esempio di codice,
Gioca con il codice commentando uno a 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();
}