VBAではクラスの継承がサポートされていませんが、インターフェースの実装はサポートされています。
VBAでは本格的なオブジェクト指向で設計してシステムを組むことはよっぽどないし、出番は少ないかもしれませんが、ブログのネタになんとなくVBAでインターフェースを使ってみました。
ちなみに私は今まで現場で、VBAでインターフェースを実装しているコードを見たことが無く、少し前まで実装できることも知りませんでした。
インターフェースとは
インターフェースとは、クラスが実装すべきメソッドの宣言をまとめたものです。インターフェースを実装したクラスは、インターフェースに宣言されているメソッドを必ず実装する必要があります。
同じインターフェースを実装したクラス群はそれぞれ同じメソッドを持つことになります。同じメソッドでもクラスによって振る舞いを変えることができる、つまりポリモーフィズムを実現することができます。
サンプルコード(VBA)
インターフェースの定義
まずはインターフェースを定義します。
サンプルとして、人間の振る舞いを定義するIHumanという名前のインターフェースにします。先頭の「I」はInterfaceの頭文字で、インターフェースであることを示すために付けています。必須ではありません。
挨拶の言葉を文字列で返すGreetメソッドを定義します。インターフェースを実装する実際のクラスでは、”インターフェース名” + “_” + “メソッド名”の名前でメソッドを定義して実装します。
' IHumanクラス
Public Function Greet() As String
' メソッドの定義のみ。
' 実際の処理はインターフェースを実装するクラスで定義する。
End Function
インターフェースの実装
ここからインターフェースを実装したクラスを作成していきます。Implements ステートメントで実装するインターフェース名を指定します。
インターフェイスで定義されているメンバーはすべて実装する必要があり、不足しているとエラーが発生します。
インターフェースを実装したクラスその1、「Japanese」クラスを作成します。日本人なのでメソッドでは「こんにちは!」と返すよう実装しておきます。
' Japaneseクラス
Implements IHuman ' IHumanインターフェースを実装
Public Function IHuman_Greet() As String
IHuman_Greet = "こんにちは!"
End Function
インターフェースを実装したクラスその2、「American」クラスを作成します。アメリカ人なのでメソッドでは「Hello!」と返すよう実装しておきます。
' Americanクラス
Implements IHuman ' IHumanインターフェースを実装
Public Function IHuman_Greet() As String
IHuman_Greet = "Hello!"
End Function
実行結果
サンプルコードをテストするためのコードです。↓
Sub Macro1()
Dim humans(1) As IHuman ' IHuman型の配列を宣言
Set humans(0) = New Japanese ' 1つ目の要素にJapaneseクラスのインスタンスを代入
Set humans(1) = New American ' 2つ目の要素にAmericanクラスのインスタンスを代入
For Each human In humans
Call Test(human) ' 配列の各要素を引数にテスト用メソッドを呼び出す。
Next
End Sub
Private Sub Test(ByVal human As IHuman)
' IHuman型の変数からGreetメソッドを実行し、結果をイミディエイトウィンドウに表示する。
Debug.Print human.Greet
End Sub
下記がイミディエイトウィンドウに表示された実行結果です。ポリモーフィズムが実現できました。
こんにちは!
Hello!