プログラミングの世界へようこそ。マクロの記録という「与えられた手順」から一歩踏み出し、自ら設計図を描こうとするあなたを、私は心から歓迎します。
今日は、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` は「私は別の存在です。親のことは関係ありません」という独立の宣言です。
どちらを使うべきか迷ったら、そのメソッドが「親と共通の目的を持っているか」を自問自答してみてください。その一瞬の迷いが、あなたのコードの品質を劇的に高めます。
ここをクリアすれば、あなたはもうただの「コーダー」ではなく、設計の深淵を理解した「エンジニア」の入り口に立っています。自信を持って、次の一行を書いてください。応援していますよ。
