我们有一个界面,可以大致简化为:
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将其解释为确切的可访问性?
答案 0 :(得分:6)
是的,你必须按字面意思实现界面。可能的解决方法是使用其他名称重新发布类中的属性:
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。
答案 1 :(得分:1)
目前语言不支持它,Visual Basic 10也不支持它(即Visual Studio 2010版本)。有一个wishlist item for exactly this。在此之前,nobugz建议的解决方法是唯一的选择。
答案 2 :(得分:1)
从Visual Basic 14开始,你的第一个VB代码示例编译得很好。
答案 3 :(得分:0)
接口属性只能由匹配的类属性实现。在vb.net和C#中都是如此。这两种语言的不同之处在于,如果可以使用同名的公共读写属性,C#的隐式接口实现功能将自动定义只读或只写属性来实现接口。