2.2 Object型を活用する

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という変数で、同一名の別のメソッドを呼び出しているところです。何となく動的継承に見えなくもないと思いませんか(笑)そこで、次の章では、これを拡張して継承もどきを作るテクニックについて紹介していきます。