VB.NETのオーバーライドと隠蔽を完全ガイド!初心者でも理解できるクラスとオブジェクト指向の基礎
生徒
「VB.NETのクラスでOverridesとかNewって見たけど、どう使うのかわかりません…。」
先生
「それはオブジェクト指向の仕組みを理解するうえでとても大事なポイントだよ。親クラスと子クラスの関係を考えるとイメージしやすいんだ。」
生徒
「親クラスと子クラス…?難しそうです…。」
先生
「身近な例を使って説明するから安心して。まずは基本から順番に見ていこう。」
1. VB.NETのオーバーライドと隠蔽とは?
VB.NETのオブジェクト指向では、親クラス(基本クラス)を元にして子クラス(派生クラス)が作られます。そのとき、親クラスにあるメソッドを子クラスで『作り変える』か『別のものとして作り直す』かという選択肢があります。この違いを理解するために知っておくべきキーワードがOverrides(オーバーライド)とNew(隠蔽・シャドウイング)です。
オーバーライドは「親の機能を引き継いで上書きする」というイメージです。一方、隠蔽は「親とは関係を切って別物として作り直す」という考え方です。これらの使い分けを理解すると、VB.NETのクラス設計がぐっと分かりやすくなります。
2. Overrides(オーバーライド)とは?
オーバーライドとは、親クラスに用意されているメソッドを子クラス側で上書きして、より適した形に書き換える手法です。例えば、親クラスが「動物」という名前で、その中に「鳴く」というメソッドがあるとします。犬という子クラスを作ったとき、「犬はワンと鳴く」ように書き換えたいですよね。これがまさにオーバーライドです。
オーバーライドを使うためには、親クラスでメソッドにOverridableキーワードを付け、子クラス側でOverridesを使って書き換えます。
Public Class Animal
Public Overridable Sub Cry()
Console.WriteLine("動物が鳴きます")
End Sub
End Class
Public Class Dog
Inherits Animal
Public Overrides Sub Cry()
Console.WriteLine("ワンワン!")
End Sub
End Class
このように子クラスが同じ名前のメソッドを「上書き」することで、同じ動作でもクラスごとに適した動きを実現できます。
3. New(隠蔽)とは?
隠蔽(シャドウイングとも呼びます)は、親クラスのメソッドとは切り離して、同じ名前だけどまったく別物のメソッドとして扱うやり方です。オーバーライドとは違い、親の機能を引き継ぐ形ではありません。
例えるなら「親のやり方は無視して、子どもは独自のやり方で行う」といったイメージです。子クラスではNewキーワードで定義します。
Public Class Animal
Public Sub Cry()
Console.WriteLine("動物が鳴きます")
End Sub
End Class
Public Class Cat
Inherits Animal
Public New Sub Cry()
Console.WriteLine("ニャー!")
End Sub
End Class
この場合、子クラスのメソッドは親のメソッドとは独立しているため、参照の仕方によって呼ばれるメソッドが変わるという特徴があります。 例えば、親型の変数に子クラスのインスタンスを入れると、親のメソッドが呼ばれます。これは初心者が混乱しやすいポイントですが、隠蔽はあくまで「別のメソッド」として扱われることを覚えておくと理解しやすいです。
4. Overrides と New の違いをやさしく比較
オーバーライドは親と子が強くつながった関係で、隠蔽は親とは別として扱う関係です。たとえば、家族の中で「ルールをより良く改良する」のがオーバーライドで、「ルールを無視して自分のルールを作る」のが隠蔽と考えると理解しやすいでしょう。
VB.NETでは、この二つを間違えて使うと意図しない動作が起こることがあります。とくに隠蔽の場合、親型の変数でアクセスすると親のメソッドが呼ばれてしまうため、プログラム全体の流れを読みにくくなることがあります。
そのため、基本的には「親クラスの機能を継承して意味のある修正をしたいならOverrides」「まったく別の実装にしたいときはNew」という形で使い分けるのが一般的です。
5. OverridesとNewを実際に比較して動作を確認する
それでは、両方を並べて動作の違いを確認してみましょう。
Public Class Animal
Public Overridable Sub Cry()
Console.WriteLine("動物が鳴きます")
End Sub
End Class
Public Class Dog
Inherits Animal
Public Overrides Sub Cry()
Console.WriteLine("ワンワン!")
End Sub
End Class
Public Class Cat
Inherits Animal
Public New Sub Cry()
Console.WriteLine("ニャー!")
End Sub
End Class
Module Program
Sub Main()
Dim a1 As Animal = New Dog()
Dim a2 As Animal = New Cat()
a1.Cry() 'オーバーライドの結果
a2.Cry() '隠蔽の結果
End Sub
End Module
実行結果:
ワンワン!
動物が鳴きます
このように、オーバーライドしたDogでは親型変数でも子クラスのメソッドが呼ばれています。一方、Catは隠蔽なので親型変数で呼び出すと親のメソッドが実行されます。