new
signifie respecter votre type REFERENCE (côté gauche de =
), exécutant ainsi la méthode des types de référence. Si la méthode redéfinie n'a pas de new
mot - clé, elle se comporte comme elle l'a fait. De plus, il est également appelé héritage non polymorphe . C'est-à-dire: «Je crée une toute nouvelle méthode dans la classe dérivée qui n'a absolument rien à voir avec les méthodes du même nom dans la classe de base.» - par ledit Whitaker
override
, qui doit être utilisé avec le virtual
mot clé dans sa classe de base, signifie respecter votre type OBJECT (côté droit de =
), exécutant ainsi la méthode surchargée quel que soit le type de référence. De plus, il est également appelé héritage polymorphe .
Ma façon de garder à l'esprit les deux mots clés qu'ils sont opposés l'un à l'autre.
override
: le virtual
mot clé doit être défini pour remplacer la méthode. La méthode utilisant un override
mot clé qui, quel que soit le type de référence (référence de la classe de base ou classe dérivée), si elle est instanciée avec la classe de base, la méthode de la classe de base s'exécute. Sinon, la méthode des classes dérivées s'exécute.
new
: si le mot-clé est utilisé par une méthode, contrairement au override
mot-clé, le type de référence est important. S'il est instancié avec une classe dérivée et que le type de référence est la classe de base, la méthode de la classe de base s'exécute. S'il est instancié avec une classe dérivée et que le type de référence est une classe dérivée, la méthode de la classe dérivée s'exécute. À savoir, c'est le contraste du override
mot - clé. En passant, si vous oubliez ou omettez d'ajouter un nouveau mot clé à la méthode, le compilateur se comporte par défaut lorsque le new
mot clé est utilisé.
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";
}
}
Appelez 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());
Production:
A
B
B
base test
derived test
Nouvel exemple de code,
Jouez avec le code en commentant un par un.
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();
}