0

如果我在 setter 上设置 Friend 级别的范围,像这样......

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,但最终开发人员不应该能够参与其中。目前我将整个类包装在一个外观中以获得此功能,但外观应该是不必要的。

4

2 回答 2

1

您缺少的是隐式和显式接口实现的概念。有关详细信息,请参阅此问题的答案

如果您认为使用 Friend setter 很可怕,请尝试将其设置为 Private 并观察它仍然可以通过界面访问!

于 2009-02-05T19:52:25.520 回答
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
于 2009-02-05T20:14:32.497 回答