2009-06-24 51 views
2

在一般情况下,根据面向对象的范例,我封装的理解基本上是说:有没有办法让一个值只能访问嵌套类VB.NET的父类?

  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如果这些成员是私有或保护。但是假设我不想让它们成为Public,因为它们暴露在外:它们可以从任何地方进行更改,而不仅仅是在ContainerClass对象内进行更改。宣布他们朋友仍然太弱,以至于他们会在应用程序中的任何地方被更改。

有什么方法可以完成我在这里的目标?如果没有,任何人都可以想出一个更明智的方式来实现这样的事情?

回答

4

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

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

  • 创建一个具有专用辅助功能的嵌套接口。这将给仅父类和嵌套子访问
  • 添加要到该接口
  • 使嵌套类实现接口
  • 让所有的实现具有私有可访问接入领域

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

例如:

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 
+0

这个建议听起来对我很有前途。我会尝试一下。 – 2009-06-24 18:53:09

0

基于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() 
相关问题