有没有办法让一个值只能被嵌套类 VB.NET 的父级访问?

Posted

技术标签:

【中文标题】有没有办法让一个值只能被嵌套类 VB.NET 的父级访问?【英文标题】:Is there a way to make a value accessible only to the parent of a nested class VB.NET? 【发布时间】:2010-11-05 14:59:28 【问题描述】:

总的来说,按照OOP范式,我对封装的理解基本是这样说的:

    如果成员是私有的,则只能由类访问。 如果成员受保护,则只能由基类和任何派生类访问。 如果成员是公开的,则任何人都可以访问。

如果我有一个嵌套类,我可以声明一个属性只能由该类及其嵌套的父类访问吗?例如:

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

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

有什么方法可以完成我在这里的目标吗?如果没有,谁能想到一个更明智的方法来实现这样的目标?

【问题讨论】:

【参考方案1】:

根据 JaredPar 的回答,您可以使用 Private 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()

【讨论】:

【参考方案2】:

没有办法直接使用可访问性修饰符的组合来做到这一点。

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

创建具有私有可访问性的嵌套接口。这将仅授予 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 :)

以上是关于有没有办法让一个值只能被嵌套类 VB.NET 的父级访问?的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 'Char' 值不能转换为 'Integer'

有没有办法在它的孩子中修改嵌套类的实现?

有没有办法让构造函数只对 C# 中的父类可见?

有没有办法在 VB.NET 中分配更多的 RAM?

有没有办法只为嵌套无序列表的父元素设置样式? [复制]

VB.Net 和 Access - 获取累加器值