在一般情况下,根据面向对象的范例,我封装的理解基本上是说:
- 如果成员是私有的,它只能通过类访问。
- 如果一个成员被保护,它只能由基类和任何派生类访问。
- 如果成员是公开的,它可以被任何人访问。
如果我有一个嵌套类,我可以声明一个属性为只能访问这个类和它的嵌套在父类? 例如:
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对象而已。 声明他们朋友仍然是太弱,因为这将让他们从应用程序内的任何地方进行修改。
有没有什么方法来完成我会在这里? 如果没有,谁能想到一个更明智的方式来实现这样的事情?
没有直接与访问修饰符的组合这样的方式。
我能想到这样做的最好的方法是如下。 它涉及到额外的间接水平。
- 带私人无障碍创建一个嵌套接口。 这将给仅父类和嵌套子访问
- 添加要访问的字段到该接口
- 使嵌套类实现接口
- 让所有的实现具有私有可访问
现在,父类,只有父类将有机会获得这些属性和方法。
例如:
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
基于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?