W języku C# dowolna metoda, którą chcesz zastąpić z baseclase, musi być abstract
, virtual
lub sama override
. Nowe słowo kluczowe faktycznie nie zastępuje. Działa to trochę inaczej:
Jeśli zadeklarujesz funkcję z nowym słowem kluczowym, ukrywając funkcję klasy podstawowej, THIS implementacja będzie używana tylko wtedy, gdy masz obiekt tego samego typu podrzędnego. Przykład:
class TopClass
{
public String getHello()
{
return "Hello";
}
public virtual String getWorld()
{
return "World";
}
}
class ChildClass : TopClass
{
public new String getHello()
{
return "Hi";
}
public override string getWorld()
{
return "Earth";
}
}
To spowoduje:
TopClass tc = new TopClass();
Console.WriteLine(tc.getHello() + " " + tc.getWorld()); // Hello World
ChildClass cc = new ChildClass();
Console.WriteLine(cc.getHello() + " " + cc.getWorld()); // Hi Earth
TopClass tc2 = new ChildClass();
Console.WriteLine(tc2.getHello() + " " + tc2.getWorld()); // Hello Earth
Console.ReadLine();
Widać różnicę nowego hasła w porównaniu do typowej ręczne: Jeśli klasa rozszerzenie jest odlewano do rodziców ClassType nadrzędnym funkcje (return Earth zamiast World) będą nadal działać, podczas gdy nowe funkcje nie są (Hi nie jest zwracane zamiast Hello).
Krótka odpowiedź: nr –
Prawdopodobnie tego użycia 'nowego' należy unikać w języku C#. Może lepiej przeprojektować? – horgh