VBAでインターフェースクラスを作る(Implements)を使ってみる

VBA

前回の「VBAにおけるクラスの継承(擬似)について考える」の続きです。

VBAにて、クラスの継承のような形を擬似的に作る方法について書かせていただきました。ただ、その方法では、保守性などに課題があるため、規模の大きな実装には不向きという内容でした。

今回紹介するインターフェースクラスを作るImplementsは、使い方には一癖ありますが、ポリモーフィズムを実現できるので、使いこなすことでより質の高いコードを書けるようになります。
また、これを使うことで、前回の課題解決が可能です。

「やりたいことのイメージ」は前回の記事と同じ内容なので、既に読まれた方はSKIPで構いません。

①やりたいことのイメージ

※詳しくは前の記事を参照願います

②共通の実装

CharacterStatusクラスは前回と同じであるため、記載を割愛します。
ParentClassは下記のようにAttackを削除し、Attackは子クラスでの実装のみとします。

③Implementsを使ってみる

Implementsというのは共通のインターフェースをクラスに持たせる機能です。言葉だけではわかりにくいので、さっそくコードを見てみましょう。下記がIJobインターフェースクラスです。

このように、外部から呼び出すため、publicで宣言だけ書いてあげます。この後Implementsを使って作る各実装クラスで共通で使うもののみ記載します。

実装クラスについては、まずJobKnightから見ていきましょう。

・JobKnight

上記記載のように、実装クラスにはImplements インタフェースクラス(IJob)宣言を記述します。これにより、実装クラスとしての機能が有効になります。試しに、この時点でコード画面の左上のオブジェクトリストを見てみてください。
下記のように、IJobが選択できるようになっているはずです。

なお、実装クラスでは、インターフェースクラスで宣言したプロパティやメソッドを全て実装する必要があります。
その際、メソッド名などの書き方はインターフェースクラス名_メソッド名のような書き方をする必要があります。(書かないとエラーになります)
手入力するのはやや面倒なのとミスタイプもあり得るので、上記のようにIJobオブジェクトを選択して、右のプロシージャリストから選択するのがおすすめです。
補足ですが、Implementsを使う場合は、これらの共通処理は隠蔽しておきたいので、Privateで定義します。

続いて、JobMageとJobHealerを見ていきます。

・JobMage 独自メソッドMagicをPublicで追加しておきます

・JobHealer 独自メソッドHealをPublicで追加しておきます

JobKnightとの違いはAttackの際に使う武器が「剣」ではなく「杖」になっている点と独自メソッドがPublicで定義されていることです。

最後に呼び出し処理を標準モジュールに作成します。

基本的には前回の記事と同様ですね。
異なる点は各playerの宣言はインターフェースクラスで行い、実装クラスとしてインスタンス生成している点と独自メソッドを呼び出す際は、実装クラスで宣言された変数にキャストするという2点です。

実行結果も前回と同じです。

記述内容が増えたので、一見するとあまり良さがわからないかもしれません。しかし、上記のplayer1,2,3はIJobで宣言されているので、Object型のような万能型を使用しなくても、いずれもIJobとして渡すことができます

実はcreateInstanceプロシージャがそのような実装となっています。New JobKnight, JobMage, JobHealer全て渡せて、かつ型安全で、もちろん自動メンバー表示も機能します。

また、Implementsを使うことでParentClassを介さなくてもAttackのポリモーフィズムが実現できているため、IJobという共通の型を持ちつつ、独自メソッドは適切に隠蔽するようになっています。(下図参照)

インターフェースクラスIJobのメンバー
実装クラスJobMageのメンバー

独自メソッドを呼び出す場合にキャストは必要なものの、型を明示して使う安全な実装になっています。厳格なコードを書きたい場合は、やはりこの方法がおすすめです。

少し癖があるので、あまり使われていない機能のように感じていますが、十分に活用する価値はあると思っています。

④まとめ

今回はVBAのImplementsについて紹介させていただきました。
やや使い方が難しいかもしれませんが、使いこなせるとかなり便利な機能だとは思いますので、クラスモジュールを使用されている方はぜひ使ってみてください。

以上、最後まで読んでいただき、ありがとうございました。

前の記事