愚者の経験

「また今度」はほとんどこない

コンストラクタで引数を入れたい

VBAのクラスによくあげられる問題点として
「Class_Initializeイベントに引数が持てない」というものがあります。

なのでNewの後に必ず何かメソッドを実行したり、標準モジュールを経由してインスタンス化するなどいろいろしてきたわけですが、Implementsを使った面白い方法がありましたので紹介します。

参考URL:http://hpcgi1.nifty.com/MADIA/VBBBS2/wwwlng.cgi?print+200511/05110142.txt
参考というかまんまです。

IConstructorクラス

Public Function Instancing(ByVal Args As Variant) As IConstructor: End Function
Class1クラス
Implements IConstructor
Private msg As String

‘コンストラクタ
Private Function IConstructor_Instancing(ByVal Args As Variant) As IConstructor
    Set IConstructor_Instancing = Me
    msg = Args(0)
End Function

Public Sub Method1()
    MsgBox msg
End Sub

標準モジュールに

Public Function Constructor(ClassObject As IConstructor, ParamArray Args() As Variant) As IConstructor
    Set Constructor = ClassObject.Instancing(Args)
End Function

これで準備OKです。テストしてみます。
Public Sub Test()
    Dim c1 As Class1
    Set c1 = Constructor(New Class1, “これはテスト”)
 
    c1.Method1
End Sub

インスタンス側のクラスがIConstructorをImplementsしていれば、自由にアップキャスト可能である点をうまく利用したすごい書き方だと思います。
書き方は気に入らないかもしれませんが、これでNewしながら引数を与えた動作になります。
クラス側でIConstructorを実装するだけなので、クラスが増えても書き足す必要もありません。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。