Почему в VB. NET невозможно объявить метод NotOverridable? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь избежать того, чтобы подклассы моего класса могли переопределить мой метод.

Если я попытаюсь сделать это, используя ключевое слово NotOverridable:

Public Class Class1
    Protected NotOverridable Sub DoSomething()
    End Sub
End Class

Я получаю эту ошибку:

'NotOverridable' cannot be specified on methods that do not override another method

1 Ответ

1 голос
/ 20 апреля 2020

Допустим, у вас есть этот класс:

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, то есть для предотвращения того, чтобы производные классы переопределяли вашу собственную переопределенную реализацию унаследованный член.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...