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
メソッドを呼ぼうとしている。
コイツを実行すると、
犯人は、
コイツ。
ちなみに、リスト1のFriend
をPublic
に変えて、
リスト3 クラスモジュール Aho
Public Sub speak(ByVal What As String) Call MsgBox("あへあへ。" & What) End Sub
にして、リスト2を実行すると、
無事完走する。
おわりに
Friend
スコープのメソッド・プロパティがこのような挙動をすることに何か意味はあるのだろうか。