有没有一种方法,使只有一个嵌套类VB.NET的父访问的价值?(Is there a way to m

2019-09-16 23:06发布

在一般情况下,根据面向对象的范例,我封装的理解基本上是说:

  1. 如果成员是私有的,它只能通过类访问。
  2. 如果一个成员被保护,它只能由基类和任何派生类访问。
  3. 如果成员是公开的,它可以被任何人访问。

如果我有一个嵌套类,我可以声明一个属性为只能访问这个类和它的嵌套在父类? 例如:

Public Class ContainerClass
    Public Class NestedClass
        Protected myInt As Integer ' <- this is what I am wondering about '
        Protected myDbl As Double ' <- this is what I am wondering about '

        Sub New()
            myInt = 1
            myDbl = 1.0
        End Sub
    End Class

    Private myNestedObject As New NestedClass

    ' this function is illegal '
    Public Sub GrowNestedObject(ByVal multiplier As Integer)
        myNestedObject.myInt *= multiplier
        myNestedObject.myDbl *= multiplier
    End Sub
End Class

在示例中,我不能直接从ContainerClass的实例访问myNestedObject.myInt或myNestedObject.myDbl如果这些成员是私有或保护。 但是,假如我不想让他们公开,因为那时他们太暴露:他们可以在任何地方进行改变,而不是内ContainerClass对象而已。 声明他们朋友仍然是太弱,因为这将让他们从应用程序内的任何地方进行修改。

有没有什么方法来完成我会在这里? 如果没有,谁能想到一个更明智的方式来实现这样的事情?

Answer 1:

没有直接与访问修饰符的组合这样的方式。

我能想到这样做的最好的方法是如下。 它涉及到额外的间接水平。

  • 带私人无障碍创建一个嵌套接口。 这将给仅父类和嵌套子访问
  • 添加要访问的字段到该接口
  • 使嵌套类实现接口
  • 让所有的实现具有私有可访问

现在,父类,只有父类将有机会获得这些属性和方法。

例如:

Class Parent
    Private Interface Interface1
        ReadOnly Property Field1() As Integer
    End Interface

    Public Class Nested1
        Implements Interface1

        Private ReadOnly Property Field1() As Integer Implements Interface1.Field1
            Get
                Return 42
            End Get
        End Property
    End Class

    Sub New()
        Dim child As Interface1 = New Nested1
        Dim x = child.Field1
    End Sub
End Class


Answer 2:

基于JaredPar的答案,你可以使用一个专用ChildClass而是一个公共接口只什么高度重视和表演,揭示:

    Public Class ParentClass

        Public Interface IChildClass
            ReadOnly Property i() As Integer
            Sub SomeSub()
        End Interface

        Private Class ChildClass
           Implements IChildClass
           Public myInt As Integer 

           Public ReadOnly Property i() As Integer Implements IChildClass.i
               Get
                   Return myInt
               End Get
           End Property

           Public Sub SomeSub() Implements IChildClass.SomeSub
           End Sub
        End Class

    Public Shared Function GetNewChild() As IChildClass
        Dim myChild = New ChildClass()
        myChild.myInt = 3
        Return myChild
    End Function
End Class

使用方法:

Dim c As ParentClass.IChildClass = ParentClass.GetNewChild()
MessageBox.Show(c.i)
c.i = 2 ' Does not compile !
c.SomeSub()


文章来源: Is there a way to make a value accessible only to the parent of a nested class VB.NET?