【入門編】VB.NETにおけるShadowsとOverridesキーワードの違い:基底クラスのメンバを隠蔽・上書きするオブジェクト指向設計の極意 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

プログラミングの世界へようこそ。マクロの記録という「与えられた手順」から一歩踏み出し、自ら設計図を描こうとするあなたを、私は心から歓迎します。

今日は、VB.NETの継承における「最大の難所」であり、かつ「設計の美学」が試される `Shadows` と `Overrides` についてお話しします。この2つのキーワードの違いを理解すれば、あなたのコードは「ただ動くだけ」のものから、「堅牢で予測可能な」ものへと一気に進化します。

継承における「上書き」と「隠蔽」:なぜ2つあるのか?

継承関係にあるクラスで、親(基底クラス)が持っている機能を子(派生クラス)で書き換えたい時、私たちはこの2つのキーワードを使い分けます。

  • `Overrides`(上書き): 親の意志を継ぎ、正統な後継者として振る舞う。
  • `Shadows`(隠蔽): 親の存在を無視し、全く新しいものとして自分の場所を確保する。

一見似ていますが、その裏にある設計思想は対極です。

1. Overrides(上書き):多態性のための「正統な継承」

`Overrides` は、オブジェクト指向の華である「ポリモーフィズム(多態性)」を実現するためにあります。「どんな型であっても、このメソッドを呼べば適切な振る舞いをするはずだ」という契約を守るためのキーワードです。

実践コード:Overridesの振る舞い

.net
Public Class Animal
‘ Overridableキーワードを付けることで、子クラスによる上書きを許可する
Public Overridable Sub Speak()
Console.WriteLine(“動物が鳴く”)
End Sub
End Class

Public Class Dog
Inherits Animal
‘ 親のSpeakメソッドを正式に置き換える
Public Overrides Sub Speak()
Console.WriteLine(“ワン!”)
End Sub
End Class

‘ 利用側のコード
Dim myPet As Animal = New Dog()
myPet.Speak() ‘ 結果は「ワン!」と表示される(これが多態性の魔法)

ここが極意:
`myPet` が `Animal` 型として宣言されていても、中身が `Dog` であれば `Dog` の `Speak` が呼ばれます。これが `Overrides` です。親の設計図を正当に拡張したいときは、必ずこれを選んでください。

2. Shadows(隠蔽):親を「無視」する緊急手段

`Shadows` は、親のメソッドを「見えなくする」だけで、関係性を断ち切ります。親のメソッドを書き換えるつもりはなく、単に「名前が被ったから自分のを優先してくれ」という主張です。

実践コード:Shadowsの振る舞い

.net
Public Class Tool
Public Sub Execute()
Console.WriteLine(“旧式の処理を実行”)
End Sub
End Class

Public Class NewTool
Inherits Tool
‘ 親のExecuteを隠蔽し、全く別のものとして再定義する
Public Shadows Sub Execute()
Console.WriteLine(“新式の処理を実行”)
End Sub
End Class

‘ 利用側のコード
Dim tool As Tool = New NewTool()
tool.Execute() ‘ 結果は「旧式の処理を実行」となる!

ここが極意:
`tool` を `Tool` 型として扱うと、いくら `NewTool` で `Shadows` しても、親の `Execute` が呼ばれます。つまり、多態性は働きません。

どっちを使えばいいの?判断基準はこれだ

開発現場で迷ったときは、以下の「判断フローチャート」を思い出してください。

1. 「親のメソッドを呼び出し元が呼び出したとき、常に自分の処理を優先してほしいか?」

  • Yes → `Overrides` を使う(親に `Overridable` を追加)。

2. 「親のメソッドは変えたくない(あるいは変えられない)、または、あえて別の型として扱ってほしいか?」

  • Yes → `Shadows` を使う。

初学者が陥りやすい罠

よくあるエラーは、「とりあえずエラーが出るから `Shadows` を付けて警告を消す」という行為です。これは非常に危険です。`Shadows` は「親との契約を破棄する」宣言です。意図せずにこれを行うと、`Animal` 型として扱った時に期待した挙動にならず、バグの温床になります。

最後に:設計は「言葉」である

`Overrides` は「私は親の代わりを完全に務め上げます」という責任ある宣言です。
`Shadows` は「私は別の存在です。親のことは関係ありません」という独立の宣言です。

どちらを使うべきか迷ったら、そのメソッドが「親と共通の目的を持っているか」を自問自答してみてください。その一瞬の迷いが、あなたのコードの品質を劇的に高めます。

ここをクリアすれば、あなたはもうただの「コーダー」ではなく、設計の深淵を理解した「エンジニア」の入り口に立っています。自信を持って、次の一行を書いてください。応援していますよ。

タイトルとURLをコピーしました