一般来说,根据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
在示例中,如果这些成员是Private或Protected,我无法从ContainerClass的实例直接访问myNestedObject.myInt或myNestedObject.myDbl。但是假设我不想让它们公开,因为它们暴露在外:它们可以从任何地方改变,而不仅仅是在ContainerClass对象中。声明他们的朋友仍然太弱,因为这样可以在应用程序中的任何地方改变它们。
有没有办法完成我的目标?如果没有,有人能想出一种更明智的方法来实现这样的目标吗?
答案 0 :(得分: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
答案 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()