重写属性和方法

更新:2007 年 11 月

派生类继承在其基类中定义的属性和方法。因为您可以在这些项适合于派生类时重新使用它们,所以这非常有用。如果基类中的属性或方法用 Overridable 关键字进行标记,则您可以为派生类中的成员定义新实现。使用 Overrides 关键字可以隐藏成员,方法为:在派生类中重定义该成员。当无法“按原状”使用成员时,这很有用。

实际上,重写的成员经常用于实现多态性。有关更多信息,请参见多态性

下列规则适用于重写方法。

  • 仅可重写在其基类中用 Overridable 关键字进行标记的成员。

  • 默认情况下,属性和方法为 NotOverridable。

  • 重写的成员必须具有与从基类继承的成员相同的参数。

  • 成员的新实现可通过在方法名称前指定 MyBase 来调用父类中的原始实现。

    说明:

    重载、重写和隐藏是很容易混淆的类似概念。有关更多信息,请参见 介绍 Visual Basic 中的对象

示例

假设您要定义类以处理工资单。您可以定义一个泛型 Payroll 类,其中包含计算普通周工资单的 RunPayroll 方法。然后可将 Payroll 用作更专用的 BonusPayroll 类(分发雇员奖金时可能会使用该类)的基类。

BonusPayroll 类可继承并重写在基类 Payroll 中定义的 PayEmployee 方法。

下面的示例定义基类 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 中的隐藏

其他资源

多态性