2006年11月02日

DocumentDiffer クラス (5)

DocumentDiffer クラス (4) に引き続き、今回はお遊びコードをご紹介します。

ネタ元は 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 が無くとも動作するクラスの作成トカ。

え?そんな変態的なクラス作るヒマがあったら、シンプルなアダプタクラスを提供しろって? まぁ、それが王道ですかね...。
posted by yamachan at 01:16| Comment(0) | TrackBack(0) | my設計パターン
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/1636294

この記事へのトラックバック