new
oznacza uszanowanie typu ODNIESIENIA (po lewej stronie =
), tym samym uruchamiając metodę typów odniesienia. Jeśli przedefiniowana metoda nie ma new
słowa kluczowego, zachowuje się tak, jak ma. Co więcej, jest również znany jako niepolimorficzne dziedziczenie . To znaczy: „Tworzę zupełnie nową metodę w klasie pochodnej, która absolutnie nie ma nic wspólnego z żadnymi metodami o tej samej nazwie w klasie bazowej”. - powiedział Whitaker
override
, który musi być używany ze virtual
słowem kluczowym w swojej klasie bazowej, oznacza respektowanie typu OBJECT (po prawej stronie =
), dzięki czemu można zastąpić metodę niezależnie od typu odwołania. Co więcej, jest również znany jako dziedziczenie polimorficzne .
Chciałbym pamiętać, że oba słowa kluczowe są sobie przeciwne.
override
: virtual
należy zdefiniować słowo kluczowe, aby zastąpić metodę. Metoda wykorzystująca override
słowo kluczowe, które niezależnie od typu odwołania (odwołanie do klasy bazowej lub pochodnej), jeśli jest tworzone z klasą bazową, działa metoda klasy bazowej. W przeciwnym razie działa metoda klasy pochodnej.
new
: jeśli słowo kluczowe jest używane przez metodę, w przeciwieństwie do override
słowa kluczowego, typ odniesienia jest ważny. Jeśli zostanie utworzona instancja z klasą pochodną, a typem referencyjnym jest klasa bazowa, uruchomiona zostanie metoda klasy bazowej. Jeśli zostanie utworzona instancja z klasą pochodną, a typem referencyjnym jest klasa pochodna, zostanie uruchomiona metoda klasy pochodnej. Mianowicie jest to kontrast override
słowa kluczowego. En passant, jeśli zapomnisz lub pominiesz dodanie nowego słowa kluczowego do metody, kompilator zachowuje się domyślnie, gdy new
używane jest słowo kluczowe.
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";
}
}
Zadzwoń w głównej części:
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());
Wynik:
A
B
B
base test
derived test
Przykład nowego kodu,
Graj kodem, komentując jeden po drugim.
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();
}