new
bedeutet, dass Sie Ihren REFERENCE-Typ (links von =
) respektieren und dabei die Methode der Referenztypen ausführen. Wenn die neu definierte Methode kein new
Schlüsselwort hat, verhält sie sich so wie sie ist. Darüber hinaus ist es auch als nicht polymorphe Vererbung bekannt . Das heißt: "Ich mache eine brandneue Methode in der abgeleiteten Klasse, die absolut nichts mit gleichnamigen Methoden in der Basisklasse zu tun hat." - Von besagtem Whitaker
override
, das mit dem virtual
Schlüsselwort in seiner Basisklasse verwendet werden muss, bedeutet, dass Sie Ihren OBJECT-Typ (rechts von =
) respektieren und dabei die Methodenüberschreibung unabhängig vom Referenztyp ausführen. Darüber hinaus ist es auch als polymorphe Vererbung bekannt .
Meine Art, beide Schlüsselwörter zu berücksichtigen, dass sie sich gegenüberstehen.
override
Das virtual
Schlüsselwort : muss definiert werden, um die Methode zu überschreiben. Die Methode mit dem override
Schlüsselwort, dass unabhängig vom Referenztyp (Referenz der Basisklasse oder abgeleiteten Klasse) die Methode der Basisklasse ausgeführt wird, wenn sie mit der Basisklasse instanziiert wird. Andernfalls wird die Methode der abgeleiteten Klasse ausgeführt.
new
: Wenn das Schlüsselwort von einer Methode verwendet wird, ist im Gegensatz zum override
Schlüsselwort der Referenztyp wichtig. Wenn es mit einer abgeleiteten Klasse instanziiert wird und der Referenztyp Basisklasse ist, wird die Methode der Basisklasse ausgeführt. Wenn es mit einer abgeleiteten Klasse instanziiert wird und der Referenztyp eine abgeleitete Klasse ist, wird die Methode der abgeleiteten Klasse ausgeführt. Es ist nämlich der Kontrast des override
Schlüsselworts. Wenn Sie vergessen oder unterlassen, der Methode ein neues Schlüsselwort hinzuzufügen, verhält sich der Compiler standardmäßig so, wie das new
Schlüsselwort verwendet wird.
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";
}
}
Rufen Sie in main:
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());
Ausgabe:
A
B
B
base test
derived test
Neues Codebeispiel,
Spielen Sie mit dem Code, indem Sie ihn einzeln kommentieren.
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();
}