Вопрос о том, следует ли рассматривать метод производного класса как переопределение для метода с базовым классом с тем же именем, часто зависит от того, знал ли автор метода производного класса о методе базового класса и связанном с ним контракте, и написал метод производного класса для выполнения этого контракта. В большинстве случаев, когда метод производного класса имеет то же имя и сигнатуру, что и метод базового класса, метод производного класса предназначен для выполнения контракта базового класса, но если автор развернутого базового класса добавляет имя не понимая, что это же имя используется для какой-либо другой цели в производном классе, нельзя предполагать, что автор метода производного класса написал свой метод для соответствия контракту для метода базового класса, который не существовал в то время .
Не существует общего средства, с помощью которого C # может определить, когда в классы были добавлены различные методы, и, следовательно, у компилятора нет возможности узнать, знал ли автор метода производного класса о существовании одноименного имени метод базового класса , если автор метода производного класса прямо указывает компилятору, знает ли он о существовании метода базового класса, используя модификаторы new
или override
.
Я бы предложил интерпретировать модификаторы (или их отсутствие) как:
Нет - автору неизвестно о существовании метода базового класса, и поэтому не может ожидать выполнения своего контракта.
new
- автору известен метод базового класса, и по какой-либо причине он написал этот метод, чтобы не выполнять его.
override
- автору известен метод базового класса и его контракт, и он написал этот метод для его выполнения.
Причина, по которой компилятор по умолчанию принимает new
, но с предупреждением, состоит в том, что в случаях, когда метод добавляется в производный класс до того, как метод базового класса когда-либо существовал, нельзя ожидать, что автор знал о контракт базового класса и, вероятно, не намеревался выполнить договор, который еще не существовал, но в случаях, когда метод производного класса пишется после метода базового класса, автору обычно следует выбирать другое имя, если только автор либо намеревается выполнить контракт базового класса, либо имеет конкретную причину использования того же имени без выполнения контракта. Компилятор не может сказать, какой метод был написан первым, и поэтому не может знать, какое поведение подходит.