Visual Basic .NETでは、継承はInheritsキーワードを使用して実装されます。これにより、共通のメソッドやプロパティを実装するクラスの階層を作成できます。
ポリモーフィズムをサポートするために、基本クラスのメソッドはOverridable修飾子で宣言され、派生クラスではOverridesを使用してオーバーライドされます。さらなるオーバーライドを防ぐためには、NotOverridable修飾子が使用されます。
例:
' 基本クラスAnimalと仮想メソッド Public Class Animal Public Overridable Sub Speak() Console.WriteLine("動物は音を出します。") End Sub End Class ' 派生クラスDogがSpeakをオーバーライド Public Class Dog Inherits Animal Public Overrides Sub Speak() Console.WriteLine("犬が吠えます。") End Sub End Class Sub Main() Dim a As Animal = New Dog() a.Speak() ' 出力: 犬が吠えます。 End Sub
Q: Visual Basic .NETでOverridable/Abstractとして宣言されていないメソッドをオーバーライドできますか?
A: いいえ。継承時にオーバーライドできるのは、Overridableとマークされたメソッドまたはインターフェース/抽象で宣言されたメソッドのみです。通常のメソッドに対してOverridesを使用しようとするとコンパイルエラーが発生します。
' エラー: Public Class A Public Sub Foo() End Sub End Class Public Class B Inherits A Public Overrides Sub Foo() ' コンパイルエラー End Sub End Class
ストーリー
1. マイクロサービスアーキテクチャに関連する実際のプロジェクトで、チームの新しいメンバーが基本クラスのコントローラーで仮想メソッドを通常のメソッド(Overridableなし)として宣言しました。その後、別の開発者が特別な処理のためにこのメソッドをオーバーライドしようとした結果、親の実装が常に呼び出されるため、ロジックの重複とバグが発生しました。
ストーリー
2. アーキテクチャの設計が不十分でポリモーフィズムが使用されなかったため、新しい派生クラスを追加する際に基本クラスのメソッドの大部分を書き換える必要があり、多くの冗長なコードが生じました。これにより、保守とサポートが複雑になりました。
ストーリー
3. コーポレートアプリケーションの事例: .NET Coreへの移行時に、開発者はメソッドをOverridableとしてマークしましたが、誤ってインターフェースのImplementsを追加しませんでした。その結果、継承階層内のメソッドの解決に曖昧さが生じ、インターフェースへの参照を介した呼び出しで問題が発生し、機能が動作しなくなりました。