書籍転載
|
![]() |
Page1
Page2
|
●8.1.3 オーバーライドのしくみ
ではいよいよ、ポリモーフィズムを実現するしくみを説明しましょう。まず初めに次のプログラムを見てください。
|
|
[サンプル]override2.vb |
Musicクラスを基本クラスにして、SongクラスとSymphonyクラスを派生しています。Mainメソッドでは、まず基本クラスであるMusicクラスへの参照型変数を定義しています。そして、Songクラスのインスタンスをアップキャストして代入し、baseInfoメソッドを呼び出しています。
さて、このbaseInfoメソッドでは、どのクラスのメソッドが呼び出されるのでしょうか。
変数mは、Musicクラスを参照する変数ですが、MusicクラスのbaseInfoメソッドが実行されるわけではありません。ここでは、Songクラスのメソッドが呼び出されます。
変数mの中身は、Songクラスのインスタンスを指しているので、宣言時の型に従うのではなく、Songクラスのメソッドが実行されるというわけです。
同様に、Symphonyクラスのインスタンスを代入すると、同じbaseInfoメソッドの呼び出しでも、今度はSymphonyクラスのメソッドが実行されます。
このように、宣言した変数の型ではなく、インスタンスに従って、呼び出される仮想メソッドが決まります。このような性質のことを、ポリモーフィズム(多態性)と呼びます。
![]() |
図8-3 オーバーライドのしくみ |
●8.1.4 メソッドの隠蔽
Shadowsキーワードを使ってメソッドを隠蔽すると、実は、ポリモーフィズムの性質まで隠蔽されてしまいます。次のプログラムを見てください。
|
|
[サンプル]override3.vb |
派生クラスのMusic2クラスでは、Shadowsキーワードを使ってbaseInfoメソッドを定義しています。
Mainメソッドでは、先ほどと同じように、Musicクラスの参照変数に、Music2クラスのインスタンスを代入しています。そして、baseInfoメソッドを呼び出します。
すると今度は、Music2クラスのメソッドではなく、変数が示すMusicクラスのbaseInfoメソッドが実行されるのです。
このように隠蔽では、ポリモーフィズムが働かなくなってしまいます。派生クラスとはいうものの、メソッドの継承関係を断ち切ってしまうのが、隠蔽なのです*2。
*2) 隠蔽の使い所としては、基本クラスの変更まではしたくないが、メソッドの呼び出しはそのままで、まったく別の実装にしたいケースなどでしょう。 |
●8.1.5 NotInheritableキーワード
自作のプログラムでは、あまり使わないとは思いますが、クラスライブラリなどでは、NotInheritableというキーワードを付けてクラスを宣言しているケースがあります。これは、継承を禁止しているのです。
継承を禁止するケースとしては、派生クラスでは、想定した動作が保証できないので、継承を許したくないといった場合です。
以下のように、NotInheritableキーワードを付けてクラスを宣言すると、継承を禁止することができます。
|
|
[構文]NotInheritableクラスの宣言 |
次のように、NotInheritableクラスを継承しようとすると、コンパイル時にエラーとなります。
|
|
[サンプル]notinherit.vb |
●8.1.6 抽象メソッド/抽象クラス
抽象メソッドとは、戻り値の型とパラメータリストだけを宣言したメソッドです。実際の中身の処理は、派生クラスで実装します。仮想メソッドの場合は、基本クラスにも処理を定義できましたが、抽象メソッドは、基本クラスでは宣言だけとなります。
抽象メソッドの宣言は、MustOverrideキーワードを付けて行います。宣言だけで、メソッドの処理ブロックはありません。
|
|
[構文]抽象メソッドの宣言 |
抽象メソッドを含むクラスでは、そのクラス自体も、抽象クラスとして宣言する必要があります。クラスの宣言の方には、MustInheritキーワードを付けます。
|
|
[構文]抽象クラスの宣言 |
具体的なプログラム例は、以下のようになります。
|
|
[サンプル]mustinherit.vb |
抽象クラスを継承したクラスは、抽象メソッドの処理を必ずオーバーライドする必要があります。上記の例では、getInfoメソッドが抽象メソッドなので、派生クラスのSongクラスで処理の内容を定義しています。
■
次回は、今回に引き続き、「8.2 インターフェイス」を転載します。
![]() |
![]() |
INDEX | ||
[書籍転載]文法からはじめるプログラミング言語Microsoft Visual Basic入門 | ||
VB開発者のためのポリモーフィズム(多態性)入門 | ||
1.ポリモーフィズムの前提知識 | ||
![]() |
2.ポリモーフィズムを実現するしくみ | |
![]() |
![]() |
「文法からはじめるプログラミング言語Microsoft Visual Basic入門」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
![]() |
|
|
|
![]() |