【发布时间】:2011-02-06 03:56:56
【问题描述】:
我正在尝试在 VB.NET 中创建一个类,它继承了一个基本抽象类并实现了一个接口。该接口声明了一个名为 Description 的字符串属性。基类包含一个名为 Description 的字符串属性。主类继承基类并实现接口。基类中存在的 Description 属性满足了接口要求。这在 C# 中运行良好,但在 VB.NET 中会导致问题。
首先,这是一个有效的 C# 代码示例:
public interface IFoo
{
string Description { get; set; }
}
public abstract class FooBase
{
public string Description { get; set; }
}
public class MyFoo : FooBase, IFoo
{
}
现在这是给出编译器错误的 VB.NET 版本:
Public Interface IFoo
Property Description() As String
End Interface
Public MustInherit Class FooBase
Private _Description As String
Public Property Description() As String
Get
Return _Description
End Get
Set(ByVal value As String)
_Description = value
End Set
End Property
End Class
Public Class MyFoo
Inherits FooBase
Implements IFoo
End Class
如果我让基类(FooBase)实现接口并将Implements IFoo.Description添加到属性中,一切都很好,但我不希望基类实现接口。
编译错误是:
类“MyFoo”必须为接口“IFoo”实现“Property Description() As String”。实现属性必须具有匹配的“ReadOnly”或“WriteOnly”说明符。
VB.NET 不能处理这个问题,还是我需要在某个地方更改我的语法才能让它工作?
【问题讨论】:
-
C# 代码无法编译,因为它没有实现抽象类的描述。你确定你真的想要一个接口和抽象基吗?
-
@gbogumil - C# 版本确实 编译 - 接口实现在基类中。
-
下面的答案回答了你的问题——我个人认为这是尝试在 VB.net 中编写干净代码时最烦人的事情之一......
-
@Chris - 但是 FooBase 不会实现这个接口,MyFoo 会,并且它确实通过继承具有适当的属性。我没有看到鸭子在这里打字。
-
@300 波特,我希望我们现在和@Paddy 在酒吧里,这将是一个有趣的醉酒争论!这是我的最后一次,这只是我的看法。如果你有一个“Fruit”的基类,它的属性是“Name”,你用“Apple”子类化它并实现“INameable.Name”,你说的是“Apple继承自Fruit,它已经有一个名为Name的属性,我不'真的不知道它做了什么,但只是用它来履行合同“。我个人认为你应该明确地这样做,即使它只是对“base.Name”的调用。