Переопределение свойств и методов
В нашем примере, где программист автоматически получает 6-процентное повышение зарплаты вместо 5-процентного, необходимо изменить поведение метода RaiseSalary и отразить в нем автоматическую надбавку. Это называется переопределением функции.
Примечание
Общие члены классов переопределяться не могут.
В отличие от многих объектно-ориентированных языков синтаксис VB.NET четко показывает, что метод базового класса должен переопределяться в производном классе. Для этого используются два специальных ключевых слова.
- Ключевое слово Overridable указывается в базовом классе для методов, которые могут переопределяться производными классами.
- Ключевое слово Overrides указывается в производном классе для переопределяемых методов.
Примечание
Естественно, типы параметров и возвращаемого значения должны совпадать. Если они различаются, происходит не переопределение, а перегрузка.
Ниже приведен примерный вид базового класса Employee с методом RaiseSalary, который может переопределяться в производных классах Programmer, Manager и т. д.:
Option Strict On Public Class Employee Private m_Name As String Private m_Salary As Decimal Private Const LIMIT As Decimal = 0.1D Public Sub New(ByVal theName As String,ByVal curSalary As Decimal) m_Name =theName m_Salary =curSalary End Sub Public Readonly Property TheName()As String Get Return m_Name End Get End Property Public Readonly Property Salary()As Decimal Get Return MyClass.m_Salary End Get End Property Public Overridable Overloads Sub RaiseSalary(ByVal Percent As Decimal) If Percent > LIMIT Then ' Операция запрещена – необходим пароль Console.WriteLine('NEED PASSWORD TO RAISE SALARY MORE " & _ "THAN LIMIT!!!!") Else m_Salary =(1 + Percent) * m_Salary End If End Sub Public Overridable Overloads Sub RaiseSalary(ByVal Percent As _ Decimal.ByVal Password As String) If Password ="special"Then m_Salary =(1 + Percent) * m_Salary End If End Sub End Class
Необязательное ключевое слово Overloads, упоминавшееся в главе 4, указывает на то, что в классе определены несколько версий RaiseSalary.
Примечание
Класс Employee часто встречается в примерах этой главы. Либо введите его в Visual Studio, либо скачайте исходный текст с сайта www.piter.com, если вы еще не сделали этого ранее.
В нашей модели зарплата программиста повышается вызовом специализированной версии метода RaiseSalary. Производный класс Programmer приведен ниже:
Public Class Programmer Inherits Employee Public Sub New(ByVal theName As String, ByVal curSalary As Decimal) MyBase.New(theName, curSalary) End Sub Public Overloads Overrides Sub RaiseSalaryCByVal Percent As Decimal) MyBase.RaiseSalary(1.2D *Percent."special") End Sub End Class
Обратите внимание, каким компактным получился производный класс – большая часть функциональности осталась неизменной, поэтому мы просто наследуем ее от базового класса!