Почему для абстрактных методов требуется новое / переопределение, а не для виртуальных методов?
Пример 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;
}
}
Компилятор отобразит эту ошибку: Для создания текущегопереопределите эту реализацию, добавьте ключевое слово override.В противном случае добавьте новое ключевое слово
Пример 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 будет иметь смысл и для виртуальных методов.
Есть ли конструктивная причина для такого поведения?
Обновление: Второеобразец на самом деле вызывает предупреждение.В первом примере показана ошибка, поскольку подкласс необходим для реализации абстрактного метода.Я не видел предупреждение в VS .. теперь имеет смысл для меня.Спасибо.