[はじめに]
・ExcelのVBA(
Visual
Basic for
Application)は、
完全オブジェクト指向言語(JavaやC#等)ほどではないですが、
オブジェクト指向によるプログラミングをサポートしています。
『オブジェクト指向』と言えば、
代表的な性質として以下の3つのキーワードがあります。
代表的な性質
継承 |
2つのクラス間で親子関係を持ち、子クラスが親クラスの性質を受け継ぐこと。 |
カプセル化 |
オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、
オブジェクトの実際の型を隠蔽したりすることをいう。 |
多態性(ポリモフィズム) |
実行される処理の実体が、コールされたメッセージではなく、メッセージを受けたオブジェクトに
よって決定される性質。
また、この性質を使って、
「同一のメッセージを使って、オブジェクトごとに異なった処理を行わせること」 |
[VBAのオブジェクト指向]
VBAのオブジェクト指向は、完全オブジェクト指向言語(JavaやC#等)のそれと比べると、
『子クラスのメソッドを経由して親クラスの変数やメソッドにアクセスできない』、
『子クラス内から親クラスの変数やメソッドにアクセスできない』等の制限事項がある。
[多態性(ポリモフィズム)]
『多態性(ポリモフィズム)』の説明で、
『動物』に『鳴く』メッセージを通知する例がよく挙げられる。
以下に、『多態性(ポリモフィズム)』を利用したサンプルコードを示す。
[クラス図]
[クラスの説明]
・
Mammalクラス
哺乳類を表すクラス。
メソッドとして、Cry()を実装。
・
Dogクラス、Catクラス、Crowクラス
イヌ、ネコ、カラスを表すクラス。各々のクラスはMammal(哺乳類)クラスを継承。
メソッドとして、Mammal_Cry()を実装。
([親クラス名]_[親クラスのメソッド名]で、親クラスのメソッドをオーバーライドできます。)
[多態性(ポリモフィズム)]
・Dogオブジェクト、Catオブジェクト、Crowオブジェクトを
Mammalオブジェクトの配列に格納する。
MammalオブジェクトのCrowメソッドを経由して、
Dogオブジェクト、Catオブジェクト、CrowオブジェクトのCrowメソッドを呼ぶ。
以下のサンプルでは、3つのMammalオブジェクトのCryメソッドを呼んでいるが、
実際に実行されるのは、Dog、Cat、CrowのMammal_Cryメソッドであることを示している。
同一のCryというメッセージをMammalオブジェクトに通知しているが、
受け取った各々のオブジェクト毎に異なった動作をしていることになる。(多態性(ポリモフィズム))
[サンプルコード]
|
Option Explicit
'[クラス名] Mammalクラス
'[説明] 哺乳類を表すクラス
' Dog(イヌ)、Cat(ネコ)、Crow(カラス)の
' 親クラスとして利用
'[メソッド名]
' Cry
'[機能]
' 動物の鳴き声を取得します。
'[前提条件]
' 子クラスでオーバーライドして下さい。
Function Cry() As String
Err.Raise _
999, , _
"このクラスのメソッドは直接呼ぶことはできません。" & vbCrLf & _
"子クラスでオーバーライドして呼んで下さい。"
End Function
| |
[ExcelVBA]Mammalクラス |
|
Option Explicit
'[クラス名] Dogクラス
'[説明] イヌを表すクラス
'Mammalクラスを実装
Implements Mammal
'[メソッド名]
' Mammal_Cry
'[機能]
' 動物の鳴き声を取得します。
'[備考]
' メソッド名は、「親クラス名」_「メソッド名」
Public Function Mammal_Cry() As String
Mammal_Cry = "ワンワン"
End Function | |
[ExcelVBA]Dogクラス |
|
Option Explicit
'[クラス名] Catクラス
'[説明] ネコを表すクラス
'Mammalクラスを実装
Implements Mammal
'[メソッド名]
' Mammal_Cry
'[機能]
' 動物の鳴き声を取得します。
'[備考]
' メソッド名は、「親クラス名」_「メソッド名」
Public Function Mammal_Cry() As String
Mammal_Cry = "ニャー"
End Function
| |
[ExcelVBA]Catクラス |
|
Option Explicit
'[クラス名] Crowクラス
'[説明] カラスを表すクラス
'Mammalクラスを実装
Implements Mammal
'[メソッド名]
' Mammal_Cry
'[機能]
' 動物の鳴き声を取得します。
'[備考]
' メソッド名は、「親クラス名」_「メソッド名」
Public Function Mammal_Cry() As String
Mammal_Cry = "カァーカァー"
End Function | |
[ExcelVBA]Crowクラス |
|
Private Sub CommandButton1_Click()
'哺乳類のオブジェクト変数を宣言
'要素数3つの配列を用意
Dim man(2) As Mammal
'イヌ、ネコ、カラスの
'オブジェクトを生成
Set man(0) = New Dog
Set man(1) = New Cat
Set man(2) = New Crow
'各々の動物の鳴き声を表示
MsgBox man(0).Cry()
MsgBox man(1).Cry()
MsgBox man(2).Cry()
'オブジェクトを解放
Set man(0) = Nothing
Set man(1) = Nothing
Set man(2) = Nothing
End Sub | |
[ExcelVBA]呼び出し元 |
[実行結果]