Takenoff Labs » Notes/Domino » Lotus Script » クラスのメンバ変数を追加・削除すると、エラーになる

[Notes/Domino] クラスのメンバ変数を追加・削除すると、エラーになる

Notes では、一応オブジェクト指向の機能も備わっておりますが、C++、Java はもとより、最近のLL言語と比べても、機能が劣ることは否めません(TT

それだけならまだしも、最も困るのが不具合。他の言語では考えられないようなエラーが発生します(涙

たとえば、スクリプトライブラリを作成し、以下のようなクラスを定義します。(テスト用なので、メンバ変数 a は意味のないものになっています。)

Public Class CTest
	Private a As String
	Private b As String
	
	Public Sub New(Byval s As String)
		b = s
	End Sub
	Public Sub Test()
		Msgbox b
	End Sub
End Class

このスクリプトライブラリを Use してエージェントを作成し、以下のように使用してみます。

Sub Initialize
	Dim t As New CTest("Test")
	Call t.Test()
End Sub

エージェントを実行すると、うまく動きます。

ではスクリプトライブラリ側のみ、メンバ変数を1つ追加してみましょう。

Public Class CTest
	Private a As String
	Private b As String
	Private c As String
	
	Public Sub New(Byval s As String)
		b = s
	End Sub
	Public Sub Test()
		Msgbox b
	End Sub
End Class

エージェント側に変更を加えずに実行してみると……はい、エラーが出ました(TT

T004 外部の名前の型が一致しません。 CTEST

メンバ変数1個追加しただけやんけ(- -メ これでエラーが出るって……。(追加した変数の型によってはエラーにならない場合もあるみたいですが……。)

ちなみに、メンバ変数 a を削除しても同じ結果となります。構造体(ユーザー定義型)の場合でも同じです。(まぁ構造体はクラスみたいなもんだからかな。)

これって、部品的なものを作るときに、とっても困ります。機能拡張でメンバ変数を追加したい場合もありますから。

この厄介な現象を回避するには、以下のようにしてください。

Public Class CTest
	Private a As String
	Private x List As String
	
	Public Sub New(Byval s As String)
		x("b") = s
	End Sub
	Public Sub Test()
		Msgbox x("b")
	End Sub
End Class

どうもメンバ変数の個数のほうが重要みたいで、既存のメンバ変数の型や名前を変える分にはエラーにならないみたいです。なんじゃそりゃ。

で、これを利用してリスト変数(他の言語で言うところの連想配列(ハッシュ)ね)にするところがミソで、「x("c")」のようにすれば、擬似的にメンバ変数を増やすことができます。

まぁこの方法は、多少コードが汚くなってしまいますから、最終手段ということで。部品的なクラスを設計するなら、最初に予備変数を作っておいたほうがよいかもしれません。

それにしても、メンバ変数の追加・削除だけでエラーになるとは……Notes 恐るべし(涙

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...

トラックバックURL :

Navigation

前の記事(カテゴリ内):

次の記事(カテゴリ内):

前の記事(日付順):

次の記事(日付順):

トラックバック

トラックバックはありません

コメント

今頃ですが、エージェントを変更(1文字入れて削除とかでいい)して保存すると再コンパイルされるので、エラーが出なくなると思います(一杯あったらどうしてくれる)。
でもこういう「プログラムは正しいのに・・・」的な動きを随所でしてくれるので困ったもんです。

たつじろうさん、コメントありがとうございます! 🙂

ご指摘のとおり、Use している設計要素を保存すれば、コンパイルされるのでOKです。
また、R6から追加された [ツール]メニュー→[すべての LotusScript をリコンパイル] 機能を使えば、全設計を1クリックでコンパイルしてくれます。

ただ、1DBで完結している場合はいいんですけど、各DBで共通に使用しているライブラリとかだと、全部のDBをリコンパイルするというのは、ちょっと現実的でなくなる場合があります。
この Tips はそのようなケースを想定しているのでした。

メンバ変数を追加・削除しただけでエラーになっちゃうなんて、ホントに困っちゃいますよね……(´~`)

※コメントは承認制となっております。管理者が承認するまで表示されません。申し訳ありませんが、投稿が表示されるまでしばらくお待ちください。





(以下のタグが使えます)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

For spam filtering purposes, please copy the number 2426 to the field below: