VBAのクラスでもインターフェイスが使えるみたいです。
目次
インターフェイスの定義
まずはインターフェイスの定義をします。
ここでは例としてclsHuman
という名前のインターフェイスを定義しています。
(クラスモジュール) clsHuman
Option Explicit Public Name As String Public Age As Integer Public Sub Greet(): End Sub Public Function GetInfo() As String: End Function
- プロパティ(
Name
やAge
)やSubプロシージャ(Greet
)、Functionプロシージャ(GetInfo
)の枠だけ定義しています。
インターフェイスの実装
次にインターフェイスで定義したプロパティやSubプロシージャ、Functionプロシージャの実装を行います。
ここでは例としてclsMan
とclsWoman
という2つのクラスで実装を行います。
(クラスモジュール) clsMan
Option Explicit Implements clsHuman ' clsHumanを実装 ' フィールド Private f_name As String Private f_age As Integer ' プロパティ: Nameの実装 Private Property Let clsHuman_Name(ByVal x_name As String) f_name = x_name End Property ' プロパティ: Nameの実装 Private Property Get clsHuman_Name() As String clsHuman_Name = f_name End Property ' プロパティ: Ageの実装 Private Property Let clsHuman_Age(ByVal x_age As Integer) f_age = x_age End Property ' プロパティ: Ageの実装 Private Property Get clsHuman_Age() As Integer clsHuman_Age = f_age End Property ' Subプロシージャ: Greetの実装 Private Sub clsHuman_Greet() Debug.Print "やぁ!僕の名前は " & f_name & " だよ。" End Sub ' Functionプロシージャ: GetInfoの実装 Private Function clsHuman_GetInfo() As String clsHuman_GetInfo = "{""man"": {""name"":""" & f_name & """, ""age"":""" & CStr(f_age) & """}}" End Function
(クラスモジュール) clsWoman
Option Explicit Implements clsHuman ' clsHumanを実装 ' フィールド Private f_name As String Private f_age As Integer ' プロパティ: Nameの実装 Private Property Let clsHuman_Name(ByVal x_name As String) f_name = x_name End Property ' プロパティ: Nameの実装 Private Property Get clsHuman_Name() As String clsHuman_Name = f_name End Property ' プロパティ: Ageの実装 Private Property Let clsHuman_Age(ByVal x_age As Integer) f_age = x_age End Property ' プロパティ: Ageの実装 Private Property Get clsHuman_Age() As Integer clsHuman_Age = f_age End Property ' Subプロシージャ: Greetの実装 Private Sub clsHuman_Greet() Debug.Print "こんにちは。私の名前は " & f_name & " よ。" End Sub ' Functionプロシージャ: GetInfoの実装 Private Function clsHuman_GetInfo() As String clsHuman_GetInfo = "<woman name=""" & f_name & """ age=""" & CStr(f_age) & """>" End Function
Implements clsHuman
で、clsHuman
を実装することを宣言します。clsHuman
の実装のため、プロパティやプロシージャ宣言の名前の頭にclsHuman_
が必要です。clsMan
とclsWoman
でそれぞれ、Greet
とGetInfo
の実装を変えています。
使用例
(モジュール) VBA_Interface
Option Explicit Public Sub Main() Dim p_taro As clsHuman Set p_taro = New clsMan With p_taro .Name = "太郎" .Age = 40 End With printInfo p_taro Dim p_hanako As clsHuman Set p_hanako = New clsWoman With p_hanako .Name = "花子" .Age = 18 End With printInfo p_hanako End Sub Private Sub printInfo(x_human As clsHuman) x_human.Greet Debug.Print x_human.GetInfo() End Sub
出力結果
(イミディエイトウィンドウ)
やぁ!僕の名前は 太郎 だよ。 {"man": {"name":"太郎", "age":"40"}} こんにちは。私の名前は 花子 よ。 <woman name="花子" age="18">
- 太郎さんと花子さんという2人の人物のインスタンスを生成しています。
clsMan
とclsWoman
はclsHuman
をImplements
しているため、clsHuman
型の変数に格納できます。(ポリモーフィズム)printInfo
にclsHuman
型としてインスタンスを引き渡し、Greet
とGetInfo
を呼び出しています。- クラスごとに実装が異なるので、結果に違いが出ます。(出力結果参照)