【问题标题】:After restricting Setter scope and then applying an interface, scope is disregarded!限制 Setter 范围然后应用接口后,范围被忽略!
【发布时间】:2009-02-05 17:57:24
【问题描述】:

如果我在 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。它完全忽略了 Friend 范围!

这太可怕了。我错过了什么??

注意:我需要这个,因为我正在设计一个 API,我希望内部 API 能够设置 IsDirty,但最终开发人员不应该能够参与其中。目前我将整个类包装在外观中以获得此功能,但外观应该是不必要的。

【问题讨论】:

    标签: vb.net scope interface setter


    【解决方案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
    

    【讨论】:

    • 诅咒!那么你在这里做什么,将类包装在外观风格的结构中并将其呈现给最终开发人员,同时保留“普通”类供内部使用?
    • 我可能会按照 nobugz 的建议将属性设为 ReadOnly,然后添加一个 Friend Sub SetIsDirty(ByVal isDirty As Boolean) 以供内部 API 使用。
    • 顺便说一句,在接口中声明属性 ReadOnly 不起作用,至少在 VB 中是这样。它不会将类上的读/写属性视为匹配项。 :/ 这是我遇到的框架中比较难看的部分之一。
    【解决方案2】:

    您缺少的是隐式和显式接口实现的概念。见the answer to this question for more details

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

    【讨论】:

    • 我做到了。 :) 当朋友不工作时,我将其设置为私有。我以为我的头要爆炸了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2017-10-20
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多