Think Twice
IT技術メモ | VBAのメモ
Created: 2021-07-02 / Updated: 2023-07-06

VBAのクラスでインターフェイスを定義しプロパティやメソッドを実装する


VBAのクラスでもインターフェイスが使えるみたいです。

目次


インターフェイスの定義

まずはインターフェイスの定義をします。
ここでは例としてclsHumanという名前のインターフェイスを定義しています。

(クラスモジュール) clsHuman
Copy
Option Explicit

Public Name As String
Public Age As Integer
Public Sub Greet(): End Sub
Public Function GetInfo() As String: End Function

インターフェイスの実装

次にインターフェイスで定義したプロパティやSubプロシージャ、Functionプロシージャの実装を行います。 ここでは例としてclsManclsWomanという2つのクラスで実装を行います。

(クラスモジュール) clsMan
Copy
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
Copy
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

使用例

(モジュール) VBA_Interface
Copy
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

出力結果

(イミディエイトウィンドウ)
Copy
やぁ!僕の名前は 太郎 だよ。
{"man": {"name":"太郎", "age":"40"}}
こんにちは。私の名前は 花子 よ。
<woman name="花子" age="18">

参考

参考サイト