ネタ元は LotusScript に対する不満?(2) Variant の名前でクラスを扱う、というあたり。カッコ良く言えば レイト・バインディング(late binding) を利用した実装ですね。 たぶんね。
DocumentDiffer クラスに、以下のような workWith() メソッドを追加します。 引数としては Variant を指定しています。 指定したオブジェクトと適切に連動する、という仕様書に書くと怒られるようなアバウトな仕様。
今回のコードでは、以前にご紹介した ログ生成用クラス との連携を実装してみます。 ログに変更点を書き出してくれるという目論見です。
Sub workWith(coWoker As Variant) If coWoker Isa "CoreLog" Then Call coWoker.logText(toString()) End If End Subが、このコードは僕の環境では動作しませんでした。 謎です。 なにせ、次のコードは動作するのですから...。
Sub workWith(coWoker As Variant) If Typename(coWoker) = "CORELOG" Then Call coWoker.logText(toString()) End If End Subちなみに、定義したときのクラス名 "CoreLog" だと動きませんでした。 以前から LotusScript は大文字小文字の区別がゆるい (Case sensitive ではない) とは感じていましたが、内部では大文字で格納しているっぽいですねぇ。
Sub workWith(coWoker As Variant) If Typename(coWoker) = "CoreLog" Then Call coWoker.logText(toString()) End If End Sub気になって試したところ、Variant で受けると Isa が利かなくなってしまうみたいですね。
coWoker as CoreLog |
coWoker as Variant |
|
coWoker Isa "CoreLog" |
True
|
False
|
coWoker Isa "CORELOG" |
True
|
False
|
Typename(coWoker) = "CoreLog" |
False
|
False
|
Typename(coWoker) = "CORELOG" |
True
|
True
|
というわけで、ちょっと遊びっぽい実装をご紹介しました。 (^-^;
でもこの WorkWith の実装例、意外に使えるかもしれませんよ。 CoreLog と連携する機能を実装して、かつ CoreLog が無くとも動作するクラスの作成トカ。
え?そんな変態的なクラス作るヒマがあったら、シンプルなアダプタクラスを提供しろって? まぁ、それが王道ですかね...。