Допустим, у вас есть этот класс:
Public Class GrandParent
Protected Sub Method1()
End Sub
Protected Overridable Sub Method2()
End Sub
End Class
, а затем у вас есть этот класс:
Public Class Parent
Inherits GrandParent
Protected Sub Method1()
End Sub
Protected Overrides Sub Method2()
End Sub
End Class
Parent.Method2
переопределяет GrandParent.Method2
, как указано. С другой стороны, Parent.Method1
НЕ переопределяет GrandParent.Method1
. Этот код генерирует следующее предупреждение:
sub 'Method1' скрывает перегружаемый элемент, объявленный в базовом классе 'GrandParent'. Если вы хотите перегрузить базовый метод, этот метод должен быть объявлен как «Перегрузка».
Если вы измените код на следующий:
Public Class Parent
Inherits GrandParent
Protected Overrides Sub Method1()
End Sub
Protected Overrides Sub Method2()
End Sub
End Class
, тогда вы получите следующее ошибка:
«Protected Overrides Sub Method1 ()» не может переопределить «Protected Sub Method1 ()», поскольку он не объявлен как «Overridable».
Затенение отличается от перегрузка в этом слежении учитывает тип ссылки, а переопределение - тип объекта. Это означает, что если у вас есть объект Parent
, назначенный переменной GrandParent
, вызов Method1
вызовет GrandParent.Method1
на основе типа ссылки, а вызов Method2
вызовет Parent.Method2
на основе тип объекта. Переопределение реализует полиморфизм там, где нет теневого копирования. Первая реализация Parent
эквивалентна этому:
Public Class Parent
Inherits GrandParent
Protected Shadows Sub Method1()
End Sub
Protected Overrides Sub Method2()
End Sub
End Class
Если вы добавите этот класс:
Public Class Child
Inherits Parent
Protected Overrides Sub Method2()
End Sub
End Class
, он будет работать как положено. Если вы изменили класс Parent
на этот:
Public Class Parent
Inherits GrandParent
Protected Shadows Sub Method1()
End Sub
Protected NotOverridable Overrides Sub Method2()
End Sub
End Class
, тогда эта дочерняя реализация сгенерирует эту ошибку:
'Защищенные переопределения Sub Method2 ()' не может переопределить ' Защищенные переопределения NotOverridable Sub Method2 () ', поскольку он объявлен как «NotOverridable».
Это единственная причина использования ключевого слова NotOverridable
, то есть для предотвращения того, чтобы производные классы переопределяли вашу собственную переопределенную реализацию унаследованный член.