Friendスコープの謎

Friendスコープの謎

クラスモジュールなどのオブジェクトモジュールでは、プロパティやメソッドのアクセス修飾子としてFriendを使うことができる。

ごく一部の人の間で有名な事実である。(ごく一部の人の間で有名であることを「有名」と言うのかどうかは知らない。)

Friendメソッドの実装

クラスモジュールを挿入して、オブジェクト名をAhoとし、次のコードを書く。

リスト1 クラスモジュール Aho
Friend Sub speak(ByVal What As String)
  Call MsgBox("あへあへ。" & What)
End Sub

たったこれだけ。

Friendメソッドspeakだけを持ったAhoクラスの完成だ!

インスタンスをObject型にぶちこんで使う

さて、このAhoクラスのインスタンスを、Aho型ではなく、Object型の変数に突っ込んでみるとどうなるか。

スト2 標準モジュール
Private Sub test02()
  Dim a As Object
  Set a = New Aho
  Call a.speak("ち~んw")
End Sub

見てのとおり、AhoクラスのインスタンスObject型の変数a(投げやりな変数名だな、オイ。)に突っ込んでから、speakメソッドを呼ぼうとしている。

コイツを実行すると、

f:id:akashi_keirin:20191019123258j:plain

な……なんだってーーー!

犯人は、

f:id:akashi_keirin:20191019123301j:plain

コイツ。

ちなみに、リスト1のFriendPublicに変えて、

リスト3 クラスモジュール Aho
Public Sub speak(ByVal What As String)
  Call MsgBox("あへあへ。" & What)
End Sub

にして、リスト2を実行すると、

f:id:akashi_keirin:20191019123304j:plain

無事完走する。

おわりに

Friendスコープのメソッド・プロパティがこのような挙動をすることに何か意味はあるのだろうか。