【VBA】インタフェース(Interface)を徹底解説【初心者向け】

【VBA】インタフェース(Interface)を徹底解説【初心者向け】

下記のリンクから各セクションにジャンプできます。

インタフェースとは?

インタフェースは、プログラム内でオブジェクト間の「契約」を定義する仕組みです。つまり、特定のメソッドやプロパティが必ず存在することを保証し、異なるクラス間で統一的な扱いを可能にします。オブジェクト指向プログラミング(OOP)の基本概念のひとつであり、プログラムの拡張性や保守性を高めるために用いられます。

VBAでは専用のインタフェース構文は用意されていませんが、クラスモジュールとImplementsキーワードを使うことで、インタフェースのような機能を実現できます。

インタフェースの基本的な考え方

インタフェースは、クラスがどのようなメソッドやプロパティを持つべきかを宣言するだけで、実際の処理内容(実装)は含みません。これにより、複数のクラスが同じインタフェースを実装することで、共通のメソッド名を通じた操作が可能となります。

例として「IAnimal」というインタフェースを考えると、IAnimalには「Speak」や「Move」といったメソッドの宣言のみが記述され、犬や猫などのクラスは、この契約に従って各自の実装を行います。こうすることで、異なる動物クラスを同じ型として扱うことができ、コードの汎用性が向上します。

インタフェースの作成方法

VBAでは、インタフェースとして利用するクラスモジュールを作成し、その中で必要なメソッドやプロパティを宣言します。これらは実装を持たず、呼び出し側に具体的な動作の実装を任せるための「ひな型」となります。

以下は、インタフェースとして機能する「IAnimal」の例です。メソッド内の処理は記述せず、単にシグネチャ(引数や戻り値の型など)だけを定義しています。

' クラスモジュール名: IAnimal
Public Sub Speak()
End Sub

Public Sub Move()
End Sub
  

このクラスモジュールをインタフェースとして保存しておくと、他のクラスが「Implements IAnimal」と記述することで、この契約に基づく実装を強制されます。

Implementsキーワードの利用

実際にインタフェースを利用するクラスを作成する場合、対象のクラスモジュール内でImplementsキーワードを使用します。Implements IAnimalと記述することで、IAnimalで定義されたすべてのメソッドを実装しなければならなくなります。

例えば、犬を表す「Dog」クラスは以下のように実装します。ここで重要なのは、メソッド名に「IAnimal_」というプレフィックスを付ける必要がある点です。

' クラスモジュール名: Dog
Implements IAnimal

Private Sub IAnimal_Speak()
    MsgBox "ワンワン"
End Sub

Private Sub IAnimal_Move()
    MsgBox "犬は走る"
End Sub
  

この形式により、VBAはDogクラスがIAnimalインタフェースの契約を正しく履行しているかをチェックできます。同様に、他のクラスも同じインタフェースを実装することで、統一的な呼び出しが可能になります。

具体例と実践コード

ここでは、IAnimalインタフェースを使って複数の動物クラスを実装し、統一的に操作する具体例を紹介します。

まず、IAnimalインタフェースを以下のように定義します。

' クラスモジュール名: IAnimal
Public Sub Speak()
End Sub

Public Sub Move()
End Sub
  

次に、犬を表すDogクラスと猫を表すCatクラスを実装します。

' クラスモジュール名: Dog
Implements IAnimal

Private Sub IAnimal_Speak()
    MsgBox "ワンワン"
End Sub

Private Sub IAnimal_Move()
    MsgBox "犬は走る"
End Sub

' クラスモジュール名: Cat
Implements IAnimal

Private Sub IAnimal_Speak()
    MsgBox "ニャーニャー"
End Sub

Private Sub IAnimal_Move()
    MsgBox "猫は静かに歩く"
End Sub
  

最後に、標準モジュールでこれらのクラスを利用するコード例です。変数をIAnimal型として宣言することで、DogやCatなど、IAnimalを実装する任意のクラスのインスタンスを一括して扱うことができます。

Sub TestAnimals()
    Dim animal As IAnimal
    
    ' Dogクラスのインスタンスを作成し、操作する
    Dim dog As New Dog
    Set animal = dog
    animal.IAnimal_Speak   ' 結果: ワンワン
    animal.IAnimal_Move    ' 結果: 犬は走る
    
    ' Catクラスのインスタンスを作成し、操作する
    Dim cat As New Cat
    Set animal = cat
    animal.IAnimal_Speak   ' 結果: ニャーニャー
    animal.IAnimal_Move    ' 結果: 猫は静かに歩く
End Sub
  

このように、インタフェースを利用することで、各クラスの内部実装が異なっていても、同じインタフェース名を通じて一貫した操作が可能となり、コードの再利用性が向上します。

応用と注意点

VBAでインタフェースの概念を応用することで、複雑なシステム内でも統一的な操作方法を実現できます。例えば、データベース接続、計算処理、ファイル操作など、異なる処理系統に対して共通のメソッドを定義する場合、インタフェースを利用して抽象化することが有効です。

ここで注意すべき点をいくつか挙げます:

  • インタフェースとして定義したクラスモジュールは直接インスタンス化できません。あくまで契約として他のクラスに実装させるためのものです。
  • 実装するメソッド名は「インタフェース名_メソッド名」という形式で記述する必要があります。これを守らないと、正しくインタフェースが認識されません。
  • インタフェースで宣言されたメソッドのシグネチャ(引数の数、型、戻り値など)は、実装側でも必ず同じでなければなりません。これにより、統一性が保たれます。

応用例として、計算処理を行うインタフェースの例も紹介します。以下は、足し算と掛け算を別々のクラスで実装し、統一的なインタフェースで操作する例です。

' クラスモジュール名: ICalculator
Public Function Calculate(a As Double, b As Double) As Double
End Function

' クラスモジュール名: Adder
Implements ICalculator

Private Function ICalculator_Calculate(a As Double, b As Double) As Double
    ICalculator_Calculate = a + b
End Function

' クラスモジュール名: Multiplier
Implements ICalculator

Private Function ICalculator_Calculate(a As Double, b As Double) As Double
    ICalculator_Calculate = a * b
End Function

Sub TestCalculator()
    Dim calc As ICalculator
    
    Dim adder As New Adder
    Set calc = adder
    MsgBox "加算結果: " & calc.ICalculator_Calculate(5, 3)  ' 結果: 8
    
    Dim multiplier As New Multiplier
    Set calc = multiplier
    MsgBox "乗算結果: " & calc.ICalculator_Calculate(5, 3)  ' 結果: 15
End Sub
  

このように、異なる計算方法を持つクラスが同じIcalculatorインタフェースを実装することで、共通の方法で計算処理を呼び出すことができます。

まとめ

VBAにおけるインタフェースは、専用のキーワードが存在しないものの、クラスモジュールとImplementsキーワードを組み合わせることで実現できます。インタフェースの利用により、複数のクラス間で共通のメソッドやプロパティを統一的に扱うことができ、プログラムの拡張性や保守性が大いに向上します。

本記事で紹介した例を参考に、ぜひ実際のプロジェクトでインタフェースの概念を取り入れてみてください。初めは少し複雑に感じるかもしれませんが、理解が深まるとより柔軟で堅牢なプログラム設計が可能となるでしょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です