使うたびに頭の中で 三石琴乃さん (マリュー・ラミアス大尉)の、「ヴァリアント、てー!」という声が響くんですよね〜 というのは嘘で。
どうも馴染めないのは、あまりに柔軟すぎるから、だとおもいます。 Variant を利用すると途端に、静的な事前チェックがほとんどできなくなる気がします。
Variant 型にもクラスのインスタンスを代入できます。 代入されたのがどのクラスかは IsA 演算子 で確認できますが、なんと! クラスそのものではなく、クラス名(文字列)と比較しているような気が。 あらビックリ。
この面白さが伝わるかどうか不明ですが、サンプルを見てみてください。 まず、適当にアクションボタンでも作成して、(Declarations) セクションに2つの適当な(ありがちな!)クラスを定義します。
Class Cat
Sub test
Msgbox |nya-|
End Sub
End Class
Class Dog
Sub test
Msgbox |bow!|
End Sub
End Class
以下のように実行部分を記述して、クラスの動作を確かめてみましょう。 ま、動かなかったら困りますね。
Sub Click(Source As Button)
Dim aCat As New Cat
Dim aDog As New Dog
Call aCat.test
Call aDog.test
End Sub
さて、これからが面白い(たぶん)ところです。 以下のような Function を追加してみます。 Panda クラスという、どこにも定義していないクラスを利用していますが、特にエラーにはなりません。
Sub doTest(target As Variant)
If target Isa "Panda" Then
Call target.test
Call target.testPanda
Elseif target Isa "Cat" Or target Isa "Dog" Then
Call target.test
End If
End Sub
念のため、以下のように実行部分を書き換えて実行すると、何事もなかったように動きます。
Sub Click(Source As Button)
Dim aCat As Variant
Dim aDog As Variant
Set aCat = New Cat
Set aDog = New Dog
Call doTest(aCat)
Call doTest(aDog)
End Sub
なんといいますか、Variant が入ることで、事前の静的なチェックがされなくなってるような。メソッド実行が単に実行時に 名前で 処理されているような、アバウトな雰囲気を感じるんですよね。
その反面、Java のように Interface を用意しなくても、名前さえあわせておけば、全然関係ないクラスのメソッドを自由に呼び出せたりしそうで、ニヤニヤしてしまいます。 かなーり変態的なコードが書けそうなニオイがするというか。
んー、楽しそう。
ちなみに、僕は普段 "Option Declare" を指定せずに、宣言しない変数を使った LotusScript を書いたりしてます。 Variant がどうこうなどと、あまり偉そうなことは言えない立場なのかも? (^-^;