2012-06-07 6 views
5

親クラスからのみ可視化してインスタンス化できるネストされたクラスを作成したいとします。
しかし、ネストされたクラスのインスタンスを親クラスのパブリック変数で使用できるようにしたいと思います。
ネストしたクラスをプライベートにするか、ネストされたクラスのコンストラクタをprivateにしようとしましたが、コンパイルされません。
.NETでこれを行うことは可能ですか?プライベートネストされたクラス

これは、コンパイルして動作しますが、ネストされたクラスは、誰でも使用することができます。

Public Class OuterClass 
     Public X As Integer = 123 
     Public NestedClassInstance As New NestedClass(Me) 

     Public Class NestedClass 
      Private Parent As OuterClass 

      Public Sub New(ByVal _Parent As OuterClass) 
       Parent = _Parent 
      End Sub 

      Public Sub GetParentX() 
       Debug.WriteLine("X = " & Parent.X.ToString) 
      End Sub 
     End Class 
    End Class 

    Sub Main() 
     Dim OuterClassInstance As New OuterClass 
     OuterClassInstance.NestedClassInstance.GetParentX() 
    End Sub 
+0

ネストされたクラスについて特別なことは、それが含まれているクラスのプライベートメンバーと保護されたメンバーにアクセスできることです(ただし、そのメンバーへの参照がある場合のみ)。これはあなたが気にかけたネストされたクラスの機能ですか、何か他のことをしようとしていましたか? –

+0

私はIntellisenseからネストされたクラスを保持しようとしていますが、親クラス以外ではインスタンス化できないという保険もあります。 – mcu

+0

私にとっては、ネストされたプライベートクラス定義は、プライベート変数と同じように、そのクラスに対してプライベートであるという点で、保持クラスでのみ使用可能でなければなりません。しかし、保持クラスがそれをインスタンス化し、保持クラス内のpublic変数に代入する場合、インスタンスは保持クラスのフィールドとして誰にでもアクセス可能でなければなりません。それはちょうど私にとって非常に自然なオブジェクトのように思えます。しかたがない。 – mcu

答えて

6

通常、プライベートネストされたクラスは、インターフェイスを実装するか、別のクラスを継承し、インターフェイス/ベースクラスが公開されます。これは、実装を親クラスに隠す場合に便利です。このような何か:

Module EntryPoint 
    Sub Main() 
     Dim OuterClassInstance As New OuterClass 
     OuterClassInstance.NestedClassInstance.GetParentX() 
    End Sub 
End Module 

Public Class OuterClass 
    Public X As Integer = 123 
    Public NestedClassInstance As ISomeImplementation = New NestedClass(Me) 

    Private Class NestedClass 
     Implements ISomeImplementation 
     Private Parent As OuterClass 

     Public Sub New(ByVal _Parent As OuterClass) 
      Parent = _Parent 
     End Sub 

     Public Sub GetParentX() Implements ISomeImplementation.GetParentX 
      Debug.WriteLine("X = " & Parent.X.ToString) 
     End Sub 
    End Class 
End Class 

Public Interface ISomeImplementation 
    Sub GetParentX() 
End Interface 
+0

これは大部分のために働きます、ありがとう。それはただ私が見つけた欠点を持っています。ネストされたクラスがパブリックフィールドを持っている場合は、それらをプロパティとして実装しないかぎり、それらをインターフェイスで使用することはできません。 – mcu

+0

また、親クラスの内部でインターフェースを移動しました。それはより自己完結型にしました。 – mcu

3

あなたはまた、パブリックインターフェイスを介して公開されたプライベート入れ子になったクラスを持つことができません。

ネストされたクラスがプライベートであるか、そうでないかのいずれかです。

ネストされたクラスを実装するためのコントラクトを持つインターフェイスを宣言することができます(一部のリファクタリングツールではクラスからインターフェイスを抽出できます)。

0

あなたは自分のライブラリーの外にオブジェクトを使用してからクライアントを維持しようとしている場合は、単にコンストラクタfriendを作ります。そうすれば、アセンブリ内のコードだけでオブジェクトを作成できます。

+0

ええと、プライベートコンストラクタを使用しようとしましたが、親クラスもそれをインスタンス化できませんでした。 – mcu

+0

友達を使ってください。私は私の答えを編集します。 – tcarvin

+0

友人がアセンブリへのアクセシビリティを制限しているので、OPのためにうまく動作しない場合があります。 –

関連する問題