2017-08-08 8 views
3

経験豊富なVBAプログラマが私自身のクラス(オブジェクト)を作成するのは初めてです。私は、Localsウィンドウですべてのプロパティが「複製」されていることに驚いています。小さな例( 'End Sub'で中断):VBAクラス/オブジェクト

' Class module: 
Private pName As String 

Public Property Let Name(inValue As String) 
    pName = inValue 
End Property 
Public Property Get Name() As String 
    Name = pName 
End Property 

' Normal module: 
Sub Test() 
    Dim objTest As cTest 
    Set objTest = New cTest 
    objTest.Name = "John Doe" 
End Sub 

[ローカル]ウィンドウに名前とpNameの両方が表示されるのはなぜですか?何らかの形でpNameを取り除くことはできますか?

敬具、 ヘルゲ

+2

デバッグ中に値を表示するだけで役立ちます。 pNameはプライベートであり、呼び出し元に対してobjTestに公開されません。 –

答えて

9

コメント&が既に述べたように、これはVBEに役立ちます。あなたはそれがうるさいプライベートフィールドと地元 toolwindowに記載されているパブリックメンバーを持って見つけた場合

はしかし、うまくそれをクリーンアップする方法があります - ここで私はThisWorkbookTest手順を入れて、Class1という名前のクラスを残しました:

clean locals toolwindow

だから何がここに起こっているの? thisとはなんですか?ここで

Class1です:

Option Explicit 

Private Type TClass1 
    Name As String 
    '...other members... 
End Type 

Private this As TClass1 

Public Property Get Name() As String 
    Name = this.Name 
End Property 

Public Property Let Name(ByVal value As String) 
    this.Name = value 
End Property 

クラスは唯一、すべてのカプセル化されたデータメンバを保持している1つのプライベートフィールド、thisという名前のユーザー定義型の値を、持っています。

その結果、プロパティの基礎となるフィールドが効果的に隠されている、というか、それらはすべてthisの下で再編成しているので、あなたがそれらを見たいと思っていない限り、あなたが基本となるフィールドの値は表示されません。

locals toolwindow, 'this' field expanded

さらに、擬似ハンガリー語の接頭辞はもう必要なく、プロパティの実装は明瞭で、すべてのプロパティの中で最も優れたものがバッキングフィールドと同じ識別子名を持っています。

+1

このアイデアが大好きです。私のクラスをすべて実装し直す時間です。 –

+0

@BSlaterこれの副作用は、オブジェクトの状態をバイナリファイルにシリアライズすること、公園内を歩くことです) –

6

すべての検査ウィンドウだけでなく、あなたへのオブジェクトの公開インタフェース、だけでなく、彼らのプライベートメンバーを示しています。 AFAIKあなたはそれについて何もできません。

デバッグ中にさらに多くの洞察を得ることができます。

私の経験では、実際のオブジェクトでは、フィールドやプロパティが多い傾向にあるため、これは問題ではありません。一貫した命名(例のように)を仮定すると、フィールドとプロパティはうまくグループ化されます。

関連する問題