Почему для абстрактных методов требуется новое/переопределенное, но не виртуальные методы?
Пример 1:
abstract class ShapesClass
{
abstract public int Area(); // abstract!
}
class Square : ShapesClass
{
int x, y;
public int Area() // Error: missing 'override' or 'new'
{
return x * y;
}
}
Компилятор покажет эту ошибку: Чтобы заставить текущий элемент переопределить эту реализацию, добавьте ключевое слово переопределения. В противном случае добавьте новое ключевое слово
Пример 2:
class ShapesClass
{
virtual public int Area() { return 0; } // it is virtual now!
}
class Square : ShapesClass
{
int x, y;
public int Area() // no explicit 'override' or 'new' required
{
return x * y;
}
}
Это будет компилироваться отлично, скрыв метод по умолчанию.
Я полностью понимаю технические различия. Однако мне интересно, почему язык был разработан именно так. Не лучше ли было бы иметь такое же ограничение в "Образце 2"? В большинстве случаев, если вы создаете метод с тем же именем, что и в родительском классе, вы обычно намерены его переопределить. Поэтому я думаю, что явное указание Override/New имеет смысл и для виртуальных методов.
Существует ли конструктивная причина такого поведения?
Update: Второй пример фактически вызывает предупреждение. Первый пример показывает ошибку, потому что подкласс необходим для реализации абстрактного метода. Я не видел предупреждения в VS.. теперь имеет для меня смысл. Спасибо.