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

Обновлен: Ноябрь 2007

Производные классы наследуют свойства и методы, определенные в их базовом классе. Это полезно, поскольку при необходимости можно повторно использовать эти элементы в производном классе. Если свойство или метод в базовом классе помечены с помощью ключевого слова Overridable, можно определить новую реализацию для такого члена в производном классе. Используйте ключевое слово Overrides, чтобы скрыть член путем переопределения его в производном классе. Это полезно, когда нельзя использовать существующую реализацию члена.

На практике переопределенные члены часто используются для реализации полиморфизма. Дополнительные сведения см. в разделе Полиморфизм.

К переопределенным методам применяются следующие правила.

  • Переопределять можно только члены, помеченные ключевым словом Overridable в базовом классе.

  • По умолчанию свойства и методы имеют атрибут NotOverridable.

  • Переопределяемые члены должны иметь те же аргументы, что и члены, унаследованные из базового класса.

  • Новая реализация члена может вызывать исходную реализацию в родительском классе путем задания MyBase перед именем метода.

    818x9db9.alert_note(ru-ru,VS.90).gifПримечание.

    Перегрузка, переопределение и переобъявление являются схожими концепциями, которые легко перепутать. Дополнительные сведения см. в разделе Знакомство с объектами в 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

См. также

Основные понятия

Перегруженные свойства и методы

Модификаторы переопределения

Сокрытие в Visual Basic

Другие ресурсы

Полиморфизм