メソッドをByRef渡しで実装するときには,型の設定に注意する必要がある。たとえば,次のようなfoo1というメソッドを考えてみよう。
Public Function foo1(ByRef test1 As Long, ByRef test2 As String)
このとき,このメソッドを次のようにして呼び出すと,「型が違います」というエラーが発生する。
foo1(t1, t2)
なお,上記のプログラムは,変数t1,t2がまだ一度も初期化されていない場合を前提とする。「型が違います」というエラーは,変数の型が違うということを示唆している。よって,型を合わせればよく,次のように呼び出せば問題はない。
Dim t1 As Long, t2 As String
foo1(t1, t2)
しかし,次のように変数をVariant型として宣言した場合には,呼び出しに失敗する。
Dim t1 As Variant, t2 As Variant
foo1(t1, t2)
Variant型は,任意の型の値を格納できるものではあるが,ByRef渡しのときの型変換は行われない。そのため,“Public Function foo1(ByRef test1 As Long, ByRef test2 As String)”というメソッドの型宣言とマッチせずにエラーが発生するのである。
ちなみに,ByVal渡しであれば型変換が行われるため,特に問題はない。たとえば,次のようなfoo2というメソッドがあるとする。
Public Function foo2(ByVal t1 As Long, ByVal t2 As String)
このとき,次の呼び出しは成功する。
Dim t1 As Variant, t2 As Variant
foo2(t1, t2)
ところで,VBScriptにはVariant型しか存在しない。そのため,“Public Function foo1(ByRef test1 As Long, ByRef test2 As String)”のように,Variant型以外の型をByRef渡しで扱うメソッドを呼び出すことができない。つまり,VBScriptからの呼び出しを前提としてByRef渡しをしたい場合には,必ず引数の型をVariant型に変換しなければならないということである。
本連載では,今後ASP(Active Server Pages)でVBScriptを使ってビジネスロジックを呼び出すプログラムも作ってゆく予定である。そのため,本章で構築するビジネスロジックにおいて,ByRef渡しとなっている変数の型は,すべてVariant型としてゆくことにする。
|