私はかなりの量のExcelVBAプログラミングを行っていますが、オブジェクト指向のプログラミングはそれほど多くありません。これが時々出てくるもので、私を悩ませています。私が見逃しているものがあるのではないかと思います。
VBAで、次のようないくつかのプライベートメンバーで定義されたクラスCがあるとします。
'...
Private hidden1_ As Double
Private hidden2_ As Double
'...
VBAがC++または(ほとんど?)OOPをサポートする他の言語のように機能する場合、次のようにクラスCのインスタンス間で同等性テストを実行するメンバー関数を作成できます。
'Error: won't compile!
Public Function equal(cinst As C) As Boolean
equal = (hidden1_ = cinst.hidden1_ And hidden2_ = cinst.hidden2_)
End Function
もちろん、クラスメンバー関数は、呼び出されたのと同じインスタンスのプライベートクラスメンバーにしかアクセスできないため、VBAではコンパイルされません。この種のことを行うために私がこれまでに思いついた最善の方法は、代わりに次のような2つのメンバー関数を定義することです。
Public Function equalDef(hidden1 As Double, hidden2 As Double) As Boolean
equalDef = (hidden1_ = hidden1 And hidden2_ = hidden2)
End Function
Public Function equal(cinst As C) As Boolean
equal = cinst.equalDef(hidden1_, hidden2_)
End Function
それは面倒で、プライベートクラスのメンバーの存在に関する知識を公開しますが、少なくともプライベートクラスのメンバーの値を実際に公開することは避けます。
これは私ができる最善のことですか?
編集:
いつものように、答えの後で、私は質問を表現するためのより良い方法に気づきました。「プライベートメンバーとのVBAクラスの同等性テストを作成するためのよりクリーンな方法はありますか?」というタイトルが付けられました。ディックがそれに答えたとき。