如果我在setter上设置了一个朋友级范围,就像这样......
Public Class MyClass
Public Property IsDirty() As Boolean
Get
Return _isDirty
End Get
Friend Set(ByVal trueFalse As Boolean)
_isDirty = trueFalse
End Set
End Property
End Class
...然后从另一个项目中调用它,它可以正常工作。我不能做像MyClass.IsDirty = True这样的事情。
大!这正是我想要的。
但是现在如果我定义一个接口,我确实必须这样做:
Public Interface IMyClass
Property IsDirty() As Boolean
End Interface
我可以做类似的事情:
Dim MyInstance as IMyClass= GetSomeInstanceOfMyClass()
MyInstance.IsDirty=True
...而且,奇怪的是,它运行了!没有抛出异常,内部变量设置为True。它完全忽略了朋友范围!
那太可怕了。我错过了什么?
注意:我需要这个,因为我正在设计一个API,我希望内部API能够设置IsDirty,但是最终开发人员不应该进入那个。目前,我将整个类包装在一个外观中以获得此功能,但外观应该是不必要的。
答案 0 :(得分:1)
您缺少的是隐式和显式接口实现的概念。请参阅the answer to this question for more details。
如果您认为与朋友制定者一样可耻,请尝试将其设置为“私人”并观看它仍可通过界面访问!
答案 1 :(得分:1)
接口方法始终具有公共可访问性。您无法通过显式接口实现来修复它,这只会隐藏类方法。只需将对象转换为接口类型即可再次获得不受限制的访问。
编辑:实际上,问题很容易解决。只需在接口声明中声明属性ReadOnly:)
例如:
Public Interface IMyClass
ReadOnly Property IsDirty() As Boolean
End Interface
Public Class Test
Implements IMyClass
Private mIsDirty As Boolean
Private ReadOnly Property IsDirtyImpl() As Boolean Implements IMyClass.IsDirty
Get
Return mIsDirty
End Get
End Property
Public Property IsDirty() As Boolean
Get
Return mIsDirty
End Get
Friend Set(ByVal value As Boolean)
mIsDirty = value
End Set
End Property
End Class