VBAでは、Object型を上手く活用することで、継承を擬似的に表現することが出来ます。まずは次のコードを見て下さい:
[class1]
Function GetMyName() As String
GetMyName = "class1"
End Function
[class2]
Function GetMyName() As String
GetMyName = "class2"
End Function
[module]
Sub Test()
Dim o1 As Object
Dim o2 As Object
Set o1 = New Class1
Set o2 = New Class2
MsgBox o1.GetMyName()
MsgBox o2.GetMyName()
end sub
|
このTest()を実行すると、順に、「class1」「class2」というメッセージが表示されます。普通の言語では、汎用の型に特化したクラスを代入した場合、その特化したクラスのメソッドを呼ぶには、型キャストを使うか、動的継承を使うかしなければなりません。しかし、それとは違い、VBAのObject型は代入したクラスのメソッドをそのまま呼ぶことが出来ます。つまり、Object型のクラスは実行時に結合されているということがわかります。
もうちょっとややこしい例を出してみましょう。VBAのコレクションは、Variant型の集まりで、どんなものでも格納できます。そこで、今作った2つのクラスのインスタンスをコレクションに格納してから使ってみましょう。
Sub Test()
Dim coll As New Collection
Dim o As Object
coll.Add item:=New Class1
coll.Add item:=New Class2
For Each o In coll
MsgBox o.GetMyName()
Next
End Sub
|
この例で重要なのは、for eachにおいて、同じoという変数で、同一名の別のメソッドを呼び出しているところです。何となく動的継承に見えなくもないと思いませんか(笑)そこで、次の章では、これを拡張して継承もどきを作るテクニックについて紹介していきます。