自作クラスのデフォルトメンバに関する大発見 その2

自作クラスのデフォルトメンバに関する発見 その2

このとき

akashi-keirin.hatenablog.com

から10箇月の時を経て、またまた世紀の大発見をしたので、紹介します。

あのときの方法

詳しくはコチラを読んでいただきたいが、早い話が、

インスタンスを突っ込んだ変数をカッコでくくれば、オブジェクト型のデフォルトメンバが発動する

ということ。

たとえば、WorksheetオブジェクトをラップしたPoweredSheetクラスのデフォルトメンバSelfメソッドが、ラップされているWorksheetオブジェクトを返すとする。

このとき、

Dim Sh As Worksheet
Set Sh = ActiveSheet
Dim ps As PoweredSheet
Set ps = New PoweredSheet
Call ps.init(Sh)

のようにしたとしても、変数psWorksheet型の引数として別メソッドに渡すことはできない。

たとえば、

Private Function getSheetName( _
             ByVal TargetSheet As WorkSheet) As String
  getSheetName = TargetSheet.Name
End Function

というメソッドがあったとして、このメソッドに

Debug.Print getSheetName(ps)

と、psを引数として渡してもだめである。

f:id:akashi_keirin:20201219151152j:plain

しかし、

Debug.Print getSheetName((ps))

このように、変数psをカッコでくくってやると、ちゃんと動く。

f:id:akashi_keirin:20201219151157j:plain

これが、前回の発見であった。

今回の発見

今回の発見は、次の通り。

すなわち、

変数の後ろにカッコをつけてもデフォルトメンバが呼ばれる

これである。

先の例で言えば、

Debug.Print getSheetName(ps())

こうすれば良いのである。

f:id:akashi_keirin:20201219151202j:plain

ほれ、この通り。

空の丸カッコを付けるのは、プログラマにとっては違和感がないと思う。

おわりに

ただ、ちょっと残念なのは、ps().まで打ち込んだときに出てくる入力候補がWorksheetクラスのものではなく、あくまでもPoweredSheetのものになってしまう点。

f:id:akashi_keirin:20201219151205j:plain

実に残念。(Name2PoweredSheetクラスに設置したデタラメなプロパティ。)