Переопределение свойств и методов
Обновлен: Ноябрь 2007
Производные классы наследуют свойства и методы, определенные в их базовом классе. Это полезно, поскольку при необходимости можно повторно использовать эти элементы в производном классе. Если свойство или метод в базовом классе помечены с помощью ключевого слова Overridable, можно определить новую реализацию для такого члена в производном классе. Используйте ключевое слово Overrides, чтобы скрыть член путем переопределения его в производном классе. Это полезно, когда нельзя использовать существующую реализацию члена.
На практике переопределенные члены часто используются для реализации полиморфизма. Дополнительные сведения см. в разделе Полиморфизм.
К переопределенным методам применяются следующие правила.
Переопределять можно только члены, помеченные ключевым словом Overridable в базовом классе.
По умолчанию свойства и методы имеют атрибут NotOverridable.
Переопределяемые члены должны иметь те же аргументы, что и члены, унаследованные из базового класса.
Новая реализация члена может вызывать исходную реализацию в родительском классе путем задания MyBase перед именем метода.
Примечание. Перегрузка, переопределение и переобъявление являются схожими концепциями, которые легко перепутать. Дополнительные сведения см. в разделе Знакомство с объектами в Visual Basic.
Пример
Допустим, необходимо определить классы для обработки платежных ведомостей. Можно определить универсальный класс Payroll, содержащий метод RunPayroll, который рассчитывает платежную ведомость на неделю. Затем можно использовать Payroll в качестве базового класса для более специализированного класса BonusPayroll, который может использоваться при распределении премий между сотрудниками.
Класс BonusPayroll может наследовать и переопределять метод PayEmployee, определенный в базовом классе Payroll.
В следующем примере определяется базовый класс Payroll, и производный класс BonusPayroll, который переопределяет наследуемый метод PayEmployee. Процедура RunPayroll создает и затем передает объект Payroll и объект BonusPayroll в функцию Pay, которая выполняет метод PayEmployee для обоих объектов.
Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D
Class Payroll
Overridable Function PayEmployee( _
ByVal HoursWorked As Decimal, _
ByVal PayRate As Decimal) _
As Decimal
PayEmployee = HoursWorked * PayRate
End Function
End Class
Class BonusPayroll
Inherits Payroll
Overrides Function PayEmployee( _
ByVal HoursWorked As Decimal, _
ByVal PayRate As Decimal) _
As Decimal
' The following code calls the original method in the base
' class, and then modifies the returned value.
PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate
End Function
End Class
Sub RunPayroll()
Dim PayrollItem As Payroll = New Payroll
Dim BonusPayrollItem As New BonusPayroll
Dim HoursWorked As Decimal = 40
MsgBox("Normal pay is: " & _
PayrollItem.PayEmployee(HoursWorked, PayRate))
MsgBox("Pay with bonus is: " & _
BonusPayrollItem.PayEmployee(HoursWorked, PayRate))
End Sub
См. также
Основные понятия
Перегруженные свойства и методы