プロパティとメソッドのオーバーライド
更新 : 2007 年 11 月
派生クラスは、基本クラスで定義されているプロパティとメソッドを継承します。このことにより、派生クラスに適したプロパティやメソッドを必要に応じて再利用できるので便利です。基本クラスで Overridable キーワードが付けられているプロパティまたはメソッドの場合、派生クラスではそのメンバに対して新しい実装を定義できます。Overrides キーワードは、派生クラスでメンバを再定義することによってシャドウする場合に使用します。これは、メンバを "そのまま" 使用できない場合に便利です。
オーバーライドしたメンバは、実際にはポリモーフィズムを実装する目的でよく使われます。詳細については、「ポリモーフィズム」を参照してください。
メソッドをオーバーライドするときには、次の規則があります。
オーバーライドできるメンバは、基本クラスで Overridable キーワードが使用されているメンバだけです。
既定では、プロパティとメソッドは NotOverridable です。
オーバーライドしたメンバは、基本クラスから継承したメンバと同じ引数を持っている必要があります。
メンバの新しい実装で、メソッド名の前に MyBase を指定すると、親クラスの元の実装を呼び出すことができます。
メモ : オーバーロード、オーバーライド、およびシャドウの概念は、似ているためにしばしば混同されます。詳細については、「Visual Basic のオブジェクトの概要」を参照してください。
例
給与支払いを処理するクラスを定義するとします。まず、通常の 1 週間分の給与を計算する RunPayroll メソッドを含む汎用の Payroll クラスを定義します。次に、Payroll を基本クラスとして、より特化した BonusPayroll クラスを作成します。これはボーナスの支給時に使用します。
BonusPayroll クラスでは、基本の Payroll クラスで定義されている PayEmployee メソッドを継承し、オーバーライドできます。
次の例では、基本クラス Payroll と派生クラス BonusPayroll を定義しています。BonusPayroll は、継承したメソッド PayEmployee をオーバーライドします。RunPayroll プロシージャは、Payroll オブジェクトと BonusPayroll オブジェクトを作成し、Pay 関数に渡します。この関数は、この 2 つのオブジェクトの 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