Иллюстрированный самоучитель по Visual Basic .NET

Переопределение свойств и методов

В приведенной ниже процедуре Sub Main компилятор генерирует вызов правильной версии метода Rai seSal ary (с 20-процентной надбавкой) для объекта sal 1у, относящегося к классу Programmer:

Sub Main()
Dim sally As New Programmed"Sally". 150000D) sally.RaiseSalary(0.1D)
' С учетом надбавки для программистов
Console.WriteLine(sally.TheName & " salary is now " & sally.Salary())
Console.ReadLine()
End Sub

Подведем итог:

  • Переопределение допускается только для членов базовых классов, объявленных с ключевым словом Overridable.
  • Если на некоторой стадии построения иерархии классов потребуется запретить дальнейшее переопределение метода в производных классах, этот метод помечается ключевым словом NotOverridable.

Ключевое слово VB.NET Notlnheritable полностью запрещает наследование от класса. Как правило, наследование запрещается для классов, выполняющих очень важные функции, которые ни в коем случае, на должны изменяться. Многие классы .NET Framework (такие, как String) помечены ключевым словом Notlnheritable именно по этой причине. Впрочем, если требуется запретить переопределение лишь одного члена класса, незачем запрещать наследование для всего класса; достаточно пометить ключевым словом NotOverridable нужный член класса.

Примечание
По умолчанию переопределение членов классов запрещается (см. описание ключевого слова Shadows ниже в этой главе). И все же ключевое слово NotOverridable рекомендуется использовать, поскольку оно более наглядно выражает намерения программиста
.

Иногда при переопределении метода или свойства возникает необходимость вызвать версию базового класса. Допустим, имени каждого программиста в классе Programmer должен предшествовать почетный титул "Code Guru". Ключевое слово MyBase позволяет обратиться к открытому свойству TheName базового класса в производном классе:

Public Overrides Readonly Property TheName() As String
Get
Return "Code Guru " & MyBase.TheName()
End Get
End Property

Учтите, что ключевое слово MyBase обладает рядом ограничений:

  • многократное повторение MyBase не позволяет получить доступ к "дедушкам" и "прадедушкам" класса в иерархии наследования; запись вида MyBase.MyBase. MemberFunction недопустима.
  • MyBase является ключевым словом языка. В отличие от Me, MyBase нельзя использовать с оператором Is, присваивать объектным переменным или передавать процедурам в качестве параметра.

С MyBase тесно связано другое ключевое слово – MyClass. Оно гарантирует, что даже в случае переопределения будет вызван метод, определенный в текущем классе, а не какая-то из его переопределенных версий в производных классах. На ключевое слово MyCl ass распространяются те же ограничения, что и на ключевое слово MyBase, о котором упоминалось в предыдущей главе.

  • MyBase – ключевое слово, а не реальный объект. Следовательно, MyClass, как и MyBase, нельзя использовать с оператором Is, присваивать объектным переменным или передавать процедурам в качестве параметра (для ссылки на конкретный экземпляр используется ключевое слово Me).
  • Ключевое слово MyClass не позволяет получить доступ к закрытым (Private) членам класса, тогда как Me предоставляет такую возможность.

Примечание
На практике ключевое слово MyClass приносит наибольшую пользу в тех случаях, когда мы хотим указать на модификацию поведения класса. Замена его на Me не дает нужного эффекта, поскольку ключевое слово Me означает "текущий экземпляр, код которого выполняется в настоящий момент", и попытки применения его в другом контексте лишь сбивают с толку
.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.