7

親クラスからのみ表示およびインスタンス化できるネストされたクラスを作成したいと考えています。
しかし、親クラスのパブリック変数を介してネストされたクラスのインスタンスを使用できるようにしたいと考えています。
ネストされたクラスをプライベートにするか、ネストされたクラスのコンストラクターをプライベートにしようとしましたが、コンパイルされません。
これを .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
4

3 に答える 3

7

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

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
于 2012-06-07T18:28:08.733 に答える
3

パブリック インターフェイスを介して公開されるプライベート ネスト クラスを使用することはできません。

それはどちらかまたは命題です - ネストされたクラスがプライベートであるか、そうでないかのどちらかです。

オプションは、ネストされたクラスに実装するコントラクトを使用してインターフェイスを宣言し (クラスからインターフェイスを抽出できるいくつかのリファクタリング ツールを使用)、ネストされたクラスをプライベートに保ちながらインターフェイスを公開することです。

于 2012-06-07T18:24:25.810 に答える
0

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

于 2012-06-07T18:49:17.163 に答える