代码之家  ›  专栏  ›  技术社区  ›  Dan Tao

有没有一种方法可以使值只能由嵌套类vb.net的父级访问?

  •  2
  • Dan Tao  · 技术社区  · 16 年前

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

    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对象中。声明它们为朋友仍然太弱,因为这将允许它们从应用程序中的任何地方进行更改。

    有什么方法可以实现我在这里的目标吗?如果不是,有人能想出一个更明智的方法来实现这样的目标吗?

    2 回复  |  直到 16 年前
        1
  •  4
  •   JaredPar    16 年前

    不能直接使用可访问性修饰符的组合来执行此操作。

    我能想到的最好的方法是如下。它涉及到一个额外的间接层次。

    • 创建具有私有可访问性的嵌套接口。这将只允许父类和嵌套子类访问
    • 添加要访问该接口的字段
    • 使嵌套类实现接口
    • 使所有实现都具有私有的可访问性

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

    例如:

    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
    
        2
  •  0
  •   Sylvain Rodrigue    16 年前

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