有没有办法使值只能访问嵌套类VB.NET的父级?

时间:2009-06-24 18:38:39

标签: vb.net encapsulation public access-modifiers protected

一般来说,根据OOP范例,我对封装的理解基本上是:

  1. 如果某个成员是私有的,则只能由该类访问。
  2. 如果成员受到保护,则只能由基类和任何派生类访问。
  3. 如果会员是公开的,任何人都可以访问。
  4. 如果我有一个嵌套类,我可以声明一个属性只能访问该类及它嵌套在其中的父类吗?例如:

    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
    

    在示例中,如果这些成员是Private或Protected,我无法从ContainerClass的实例直接访问myNestedObject.myInt或myNestedObject.myDbl。但是假设我不想让它们公开,因为它们暴露在外:它们可以从任何地方改变,而不仅仅是在ContainerClass对象中。声明他们的朋友仍然太弱,因为这样可以在应用程序中的任何地方改变它们。

    有没有办法完成我的目标?如果没有,有人能想出一种更明智的方法来实现这样的目标吗?

2 个答案:

答案 0 :(得分:4)

无法通过可访问性修饰符的组合直接执行此操作。

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

  • 创建具有私有辅助功能的嵌套界面。这将仅提供Parent类和嵌套子级访问
  • 将您要访问的字段添加到该界面
  • 使嵌套类实现接口
  • 使所有实施都具有私人辅助功能

现在,父类只有父类才能访问这些属性和方法。

例如:

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

答案 1 :(得分:0)

根据JaredPar的回答,您可以使用私有子类,但只能显示它可以显示的公共接口:

    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()