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 回答