VB.Net 中接口中定义的属性的受保护集

2024-03-24

我们有一个界面,可以大大简化为:

public interface IPersistable<T>
{
    T Id { get; }
}

大多数实现该接口的地方都希望拥有它,以便该属性有一个受保护的或私有的集,即在 C# 中:

public class Foo : IPersistable<int>
{
    public int Id { get; protected set; }
}

但是,我无法获得任何遵循相同模式的示例 VB.Net 代码进行编译,同时仍实现该接口,因此:

Public Class Foo
    Implements IPersistable(Of Integer)

    Public Property Id() As Integer Implements IPersistable(Of Integer).Id
        Get
            Throw New NotImplementedException()
        End Get
        Protected Set(ByVal value As Integer)
            Throw New NotImplementedException()
        End Set
    End Property
End Class

...不会编译,但这会:

Public Class Foo
    Public Property Id() As Integer
        Get
            Throw New NotImplementedException()
        End Get
        Protected Set(ByVal value As Integer)
            Throw New NotImplementedException()
        End Set
    End Property
End Class

我明白这个例子过于琐碎,并且通过受保护的构造函数可能会更好地实现,但我很感兴趣是否可以通过这种方式完成?

[ 编辑: ] ...显然,如果类型想要使用 XMLSerialization,那么属性需要是公共读/写的,或者类型需要为每个类型编写自定义序列化程序。

本质上,我认为接口应该定义最小可访问性,但 VB 将其解释为确切的可访问性?


是的,您必须按字面意思实现该接口。一种可能的解决方法是使用另一个名称重新发布类中的属性:

Public Class Foo
  Implements IPersistable(Of Integer)
  Private m_Id As Integer

  Public ReadOnly Property Id() As Integer Implements IPersistable(Of Integer).Id
    Get
      Return m_Id
    End Get
  End Property

  Protected Property IdInternal() As Integer
    Get
      Return m_Id
    End Get
    Set(ByVal value As Integer)
      m_Id = value
    End Set
  End Property
End Class

如果您打算在派生类中重写该属性,请将其声明为 Overridable。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB.Net 中接口中定义的属性的受保护集 的相关文章

随机推荐