概要
VBA / VBScriptのコンストラクタといえば Class_Initialize ですが、
モダンな言語とは異なり、コンストラクタに引数を渡すことができません。
そこで似非ではありますが、こんな感じで引数を渡せるようにしました。
Sample.vbs
Dim arg1 : arg1 = "foo"
Dim arg2 : arg2 = 1234
Dim objSample
Set objSample = (New clsSample)(arg1, arg2)
作成ポイント
- Defaultキーワードの付いたGetterプロパティを作成する
- ※値が返せればいいので、Functionでも可能
- Getterプロパティはクラス自身(Me)を返す
実際のコード
SampleClass.vbs
Class clsSample
Private PriStrArg1, PriStrArg2
' VBScriptの標準コンストラクタ
Private Sub Class_Initialize()
' do stuff
End Sub
'コンストラクタの引数を受け取り、クラス自身を返すプロパティを作成
Public Default Property Get Constructor(StrArg1, StrArg2)
PriStrArg1 = StrArg1
PriStrArg2 = StrArg2
Set Constructor = Me
End Property
End Class
動作概要
- プロパティ(もしくはメソッド)に付与されている
Default
キーワードによって、プロパティを省略してクラスにアクセスした際にConstructorが呼び出される - Constructorプロパティ内で自身を返すことで、クラスの変数への代入を行う
- メソッドチェーンを実現するための書き方と同じです
処理としては以下と等価です
Sample.vbs
Dim arg1 : arg1 = "foo"
Dim arg2 : arg2 = 1234
Dim objSample
Set objSample = New clsSample
Call ObjSample.Constructor(arg1, arg2)
おわりに
- これをやったところでコンストラクタの引数を必須にはできません。
- 普通に引数なしで
New clsSample
できてしまいます
- 普通に引数なしで
- こんな意味わからないことしてコード読みにくくするくらいなら手続き的に書きましょう
- こんなのよりPowerShellを覚えましょう