カテゴリ: VB.NET 更新日: 2026/03/29

VB.NETのオーバーライドと隠蔽を完全ガイド!初心者でも理解できるクラスとオブジェクト指向の基礎

VB.NETのオーバーライド(Overrides)と隠蔽(New)の違い
VB.NETのオーバーライド(Overrides)と隠蔽(New)の違い

先生と生徒の会話形式で理解しよう

生徒

「VB.NETのクラスでOverridesとかNewって見たけど、どう使うのかわかりません…。」

先生

「それはオブジェクト指向の仕組みを理解するうえでとても大事なポイントだよ。親クラスと子クラスの関係を考えるとイメージしやすいんだ。」

生徒

「親クラスと子クラス…?難しそうです…。」

先生

「身近な例を使って説明するから安心して。まずは基本から順番に見ていこう。」

1. VB.NETのオーバーライドと隠蔽とは?

1. VB.NETのオーバーライドと隠蔽とは?
1. VB.NETのオーバーライドと隠蔽とは?

VB.NETのオブジェクト指向では、親クラス(基本クラス)を元にして子クラス(派生クラス)が作られます。そのとき、親クラスにあるメソッドを子クラスで『作り変える』か『別のものとして作り直す』かという選択肢があります。この違いを理解するために知っておくべきキーワードがOverrides(オーバーライド)New(隠蔽・シャドウイング)です。

オーバーライドは「親の機能を引き継いで上書きする」というイメージです。一方、隠蔽は「親とは関係を切って別物として作り直す」という考え方です。これらの使い分けを理解すると、VB.NETのクラス設計がぐっと分かりやすくなります。

2. Overrides(オーバーライド)とは?

2. Overrides(オーバーライド)とは?
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(隠蔽)とは?

3. New(隠蔽)とは?
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 の違いをやさしく比較

4. Overrides と New の違いをやさしく比較
4. Overrides と New の違いをやさしく比較

オーバーライドは親と子が強くつながった関係で、隠蔽は親とは別として扱う関係です。たとえば、家族の中で「ルールをより良く改良する」のがオーバーライドで、「ルールを無視して自分のルールを作る」のが隠蔽と考えると理解しやすいでしょう。

VB.NETでは、この二つを間違えて使うと意図しない動作が起こることがあります。とくに隠蔽の場合、親型の変数でアクセスすると親のメソッドが呼ばれてしまうため、プログラム全体の流れを読みにくくなることがあります。

そのため、基本的には「親クラスの機能を継承して意味のある修正をしたいならOverrides」「まったく別の実装にしたいときはNew」という形で使い分けるのが一般的です。

5. OverridesとNewを実際に比較して動作を確認する

5. 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は隠蔽なので親型変数で呼び出すと親のメソッドが実行されます。

まとめ

まとめ
まとめ

VB.NETにおけるオーバーライドと隠蔽の違いは、オブジェクト指向プログラミングを理解するうえで非常に重要な考え方です。クラス設計を行う際に、この二つの使い分けができるかどうかで、コードの可読性や保守性、さらにはバグの発生しやすさまで大きく変わってきます。まずオーバーライドは、親クラスの機能を受け継ぎつつ、その動作を子クラスに合わせて上書きする仕組みです。これにより、共通のインターフェースを保ちながら、クラスごとに異なる振る舞いを実現することができます。このような仕組みはポリモーフィズムとも呼ばれ、実務でも頻繁に利用される重要な技術です。

一方で隠蔽は、親クラスのメソッドとは完全に別のものとして、新しいメソッドを定義する方法です。同じ名前を使っていても、内部的にはまったく異なる処理として扱われるため、呼び出し方によって実行される内容が変わる点が特徴です。この挙動は初心者にとって少し分かりにくい部分ですが、仕組みを理解すると、意図的に異なる処理を分離したい場合に役立ちます。ただし、可読性を下げる原因にもなりやすいため、むやみに使うのではなく、必要な場面に限定して利用することが大切です。

実際の開発現場では、基本的にはオーバーライドを優先して使用するケースが多く見られます。なぜなら、親クラスとの関係性が明確になり、コードの流れを追いやすくなるからです。特に大規模なシステムでは、どのクラスがどの処理を担っているのかを把握することが重要になるため、オーバーライドによる継承関係の明示は大きなメリットとなります。逆に隠蔽を多用すると、同じ名前のメソッドが複数存在することで混乱を招きやすくなり、バグの原因になる可能性があります。

また、VB.NETのクラス設計においては、Overridable、Overrides、Newといったキーワードの意味を正しく理解することが欠かせません。これらのキーワードは単なる文法ではなく、設計思想そのものに関わる重要な要素です。たとえば、将来的に拡張されることを想定したクラスでは、あらかじめOverridableを付けておくことで柔軟な設計が可能になります。このように、先を見据えたクラス設計を行うことが、質の高いプログラムを書くための第一歩といえるでしょう。

最後に、今回学んだ内容をしっかりと定着させるためには、実際にコードを書いて動作を確認することが重要です。理論だけで理解したつもりになってしまうと、いざ実務で使うときに混乱してしまうことがあります。小さなサンプルプログラムを作成し、オーバーライドと隠蔽の動きの違いを何度も確認することで、自然と理解が深まっていきます。VB.NETの基礎をしっかりと身につけることで、より高度なオブジェクト指向設計へとステップアップすることができるでしょう。

サンプルプログラムで理解を深める


Public Class Animal
    Public Overridable Sub Speak()
        Console.WriteLine("動物です")
    End Sub
End Class

Public Class Bird
    Inherits Animal
    Public Overrides Sub Speak()
        Console.WriteLine("チュンチュン")
    End Sub
End Class

Public Class Fish
    Inherits Animal
    Public New Sub Speak()
        Console.WriteLine("・・・")
    End Sub
End Class

Module Program
    Sub Main()
        Dim a As Animal = New Bird()
        Dim b As Animal = New Fish()

        a.Speak()
        b.Speak()
    End Sub
End Module

実行結果


チュンチュン
動物です
先生と生徒の振り返り会話

生徒

オーバーライドは親の処理を上書きして使う方法で、隠蔽は別のメソッドとして扱う方法なんですね。

先生

その通りだよ。特に重要なのは、オーバーライドは親子関係を保ったまま動作が変わるという点だね。

生徒

だから親型の変数でも子クラスの処理が呼ばれるんですね。

先生

よく理解できているね。一方で隠蔽は、同じ名前でも別物だから親型で呼ぶと親の処理になる。

生徒

確かにそれは間違えそうです。基本はオーバーライドを使ったほうが良さそうですね。

先生

そうだね。設計が分かりやすくなるからね。隠蔽はどうしても必要なときだけ使うといいよ。

生徒

クラス設計の考え方が少し分かってきました。もっと練習してみます。

先生

実際に手を動かして確認するのが一番だよ。これからも少しずつ理解を深めていこう。

関連記事:
カテゴリの一覧へ
新着記事
New1
VB.NET
VB.NETの変数とは?初心者向けに定義方法とよく使うデータ型を解説
New2
ASP.NET
ASP.NET MVCでモデルを定義してデータを扱う方法を初心者向けに解説
New3
ASP.NET
ASP.NETのマイグレーションを使ったスキーマ管理方法を完全解説!初心者でも安心
New4
ASP.NET
MacでASP.NET開発を始める方法|初心者向けにVisual Studioと.NET SDKを解説
人気記事
No.1
Java&Spring記事人気No1
ASP.NET
ASP.NETとは?初心者向けにできることと特徴をやさしく解説
No.2
Java&Spring記事人気No2
ASP.NET
ASP.NET WebFormsとは?基本概念と仕組みを初心者向けにやさしく解説
No.3
Java&Spring記事人気No3
VB.NET
VB.NETで日付を文字列に変換!ToStringやFormatの使い方を徹底解説
No.4
Java&Spring記事人気No4
VB.NET
VB.NETプログラムの書き方を基礎から学ぼう!初心者が覚えるべき文法とは?
No.5
Java&Spring記事人気No5
VB.NET
VB.NETで日付を加算・減算する方法を完全ガイド!AddDaysやAddMonthsの使い方
No.6
Java&Spring記事人気No6
VB.NET
VB.NETで日付と時間を比較・計算する方法!CompareとSubtractを完全解説
No.7
Java&Spring記事人気No7
VB.NET
VB.NETの配列(Array)の作り方と基本操作を徹底解説!初心者でもわかる入門ガイド
No.8
Java&Spring記事人気No8
ASP.NET
ASP.NET MVCのフォーム送信とPOSTデータの受け取り方を完全解説!初心者でもわかる入力処理の基本