限制Setter范围然后应用接口后,范围将被忽略!

时间:2009-02-05 17:57:24

标签: vb.net scope interface setter

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

2 个答案:

答案 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