17

Me キーワードは、独自のクラス モデル内にある場合でも、プライベート プロシージャにアクセスできないことを発見しました。

Class1 で次のコードを取得します。

Private Sub Message()
    Debug.Print "Some private procedure."
End Sub

Public Sub DoSomething()
    Me.Message
End Sub

このコードは、クラスのインスタンスをインスタンス化します。

Sub TestClass()
    Dim objClass As New Class1
    objClass.DoSomething
End Sub

Me.Messageコンパイル エラー「メソッドまたはデータ メンバーが見つかりません」をスローします。

手順に変更Private Sub Message()すると正常に動作します。PublicDoSomething プロシージャから Me キーワードを削除することもできますが、Me キーワードの背後にある考え方は、Class1 の複数のインスタンスが適切にカプセル化されるようにすることであるという印象を受けました。

プライベートな場合、VBA Me キーワードが独自のモジュール内のプロシージャにアクセスできないのはなぜですか? Me キーワードを省略して、クラスでこのようなことをしても安全ですか?

Private Sub Message()
    Debug.Print "Some private procedure."
End Sub

Public Sub DoSomething()
    Message
End Sub

ありがとう!

更新: 適切な構文に関するヒントをありがとう、私のコードは機能しています。Me が独自のモジュールのインスタンスでプライベート プロシージャを参照できる理由の説明をまだ探しています。適切なドキュメントが見つかりませんでした。

4

5 に答える 5

9

なぜそれがそのように設計されたのかについての推測は、設計者と話をしなくても純粋な仮定になります。しかし、私自身の推測では、Meキーワードはコードが現在実行されているオブジェクトへの参照を返します。の特別なケースを作成するよりもMe、オブジェクトのスコープのルールに従う方が簡単であることがわかりました。つまりobject.method、パブリックメソッドまたはフレンドメソッドでのみ機能します。つまりMe、はまさにそれが言っていることであり、現在実行中のオブジェクトのインスタンスです。また、VBA / VB6には共有メソッドがないため、プレフィックスを付けるかどうかは重要ではありませMeん。

しかし、それで気分が良くなるとしたら、それも信じられないほど不快だと思います。

于 2009-12-15T16:09:11.070 に答える
3

Me独自のクラス内で呼び出すキーワードは必要ありません。

于 2009-12-13T05:35:15.947 に答える
1

Me はこのクラス オブジェクトのインスタンスです。したがって、このクラスのパブリック関数またはサブルーチンを除いて、プライベート サブルーチンまたは関数を直接呼び出したり、プライベート変数にアクセスしたりすることはできません。

于 2013-01-12T12:29:01.850 に答える
0

COM では、オブジェクト インスタンスの型とオブジェクト変数の型に違いがあります。特に、オブジェクト変数の型はインターフェイス型として動作します。すべての型は少なくとも 1 つのインターフェイス (それ自体) を実装しますが、型は他のインターフェイスも実装する場合があります。そのような能力は、継承を偽造するために使用されます。

一部のフレームワークでは、クラスFooにプライベート メンバーがある場合Bar、タイプの null 以外の変数はFoo、そのメンバーを含む何らかのクラス オブジェクトへの参照を保持します。メンバーは外部コードからアクセスできない場合がありますが、存在するため、 のコード内のどこからでもアクセスできますFoo

ただし、COM クラス変数型は、継承可能なクラス型ではなくインターフェイスのように動作するため、型の変数が非パブリック メンバーのFooいずれかを持つオブジェクトを参照するという保証はありません。FooコンパイラはMeが常に現在のオブジェクトを参照することを認識できますが、これは実際の型Fooになりますが、のプライベート メンバーにFooアクセスできる唯一のオブジェクトであるという事実Meは、コンパイラがドットをサポートする本当の理由がないことを意味します。プライベート メンバーのベースの逆参照。

于 2013-01-13T04:06:54.690 に答える