new
будет затенять метод совершенно новым методом (который может иметь или не иметь одну и ту же сигнатуру) вместо его переопределения (в этом случае новый метод должен иметь одинаковую сигнатуру), что означает, что полиморфизм не будетРабота.Например, у вас есть эти классы:
class A {
public virtual int Hello() {
return 1;
}
}
class B : A {
new public int Hello(object newParam) {
return 2;
}
}
class C : A {
public override int Hello() {
return 3;
}
}
Если вы сделаете это:
A objectA;
B objectB = new B();
C objectC = new C();
Console.WriteLine(objectB.Hello(null)); // 2
Console.WriteLine(objectC.Hello()); // 3
objectA = objectB;
Console.WriteLine(objectA.Hello()); // 1
objectA = objectC;
Console.WriteLine(objectA.Hello()); // 3
Поскольку вы можете определять сигнатуры новых методов с помощью new
, компилятору будет невозможно узнатьчто экземпляр A
на самом деле является экземпляром B
, и новый метод, определяемый B
, должен быть доступен.new
может использоваться, когда метод, свойство, поле или событие родительского объекта не объявлено с virtual
, и из-за отсутствия virtual
компилятор не будет «искать» унаследованный метод.Однако с virtual
и override
это работает.
Я настоятельно рекомендую вам избегать new
;в лучшем случае это сбивает с толку, потому что вы определяете метод с именем, которое можно было бы распознать как что-то другое, а в худшем случае он может скрывать ошибки, вносить кажущиеся невозможными ошибки и затруднять расширение функциональности.