В C # функция, не помеченная virtual
(которая также включает переопределения виртуальных функций), эффективно закрыта и не может быть переопределена.Итак, ваш пример кода на самом деле не будет скомпилирован, потому что ключевое слово override недопустимо, если в базовом классе нет метода, помеченного как виртуальный с той же сигнатурой.
Если A.methodB () помечены как виртуальные, тоВы могли бы переопределить метод из A, но предотвратить его дальнейшее переопределение в классах, производных более косвенно, используя ключевое слово sealed
точно так же, как вы показали.
Следует помнить, что переопределение метода можетбыть предотвращенным, метод скрывается не может.Учитывая ваше текущее определение класса A, следующее определение класса B является допустимым, и вы ничего не можете с этим поделать:
class B:A
{
public new void methodB()
{
//code
}
}
Ключевое слово new
в основном "нарушает" иерархию наследования / переопределения, поскольку оноотносится к этому одному методу;любая ссылка на класс B, рассматриваемая как класс B (или любой другой производный тип), будет использовать реализацию из класса B и игнорировать реализацию из класса A, если реализация B специально не вызывает к ней обратный вызов.Однако если вы рассматриваете экземпляр класса B как класс A (путем его приведения или передачи в качестве параметра), тогда «новая» реализация игнорируется.
Это отличается от переопределения, гдекласс B, который обрабатывается как класс A и действительно переопределяет виртуальный метод B, все равно будет использовать переопределение класса B метода.Также поймите, что скрытие метода подразумевается (хотя вы получите предупреждение компилятора);если вы объявляете метод с той же сигнатурой в производном классе и не указываете новый или переопределенный, метод базового класса будет скрыт.