我正在尝试在VB.NET中创建一个继承基本抽象类并实现接口(interface)的类。该接口(interface)声明了一个名为Description的字符串属性。基类包含一个名为Description的字符串属性。主类继承基类并实现接口(interface)。基类中存在Description属性可以满足接口(interface)要求。这在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
)实现该接口(interface)并将Implements IFoo.Description
添加到该属性中,一切都很好,但是我不希望基类实现该接口(interface)。编译器错误是:
VB.NET不能处理此问题,还是需要在某个地方更改语法才能使其正常工作?
最佳答案
您需要在基类中将属性标记为Overridable
或MustOverride
,然后可以在子类中将其覆盖:
Public MustInherit Class FooBase
Private _Description As String
Public Overridable 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
Public Overrides Property Description() As String Implements IFoo.Description
Get
Return MyBase.Description
End Get
Set(ByVal value As String)
MyBase.Description = value
End Set
End Property
End Class
编辑
这是对@ M.A。的回应Hanin发布了。我们两种解决方案都可以工作,但是了解每种解决方案的重要性很重要。想象以下代码:
Dim X As FooBase = New MyFoo()
Trace.WriteLine(X.Description)
X.Description产生了什么?使用Overridable,您将获得对子类的调用,而使用Overload方法,您将获得对基类的调用。对与错都不对,了解声明的后果很重要。使用Overload方法,您必须向上转换以获得 child 的实现:
Trace.WriteLine(DirectCast(X, MyFoo).Description)
如果您只是从子类中调用MyBase.Description,那么这个问题就没有意义了,但是,如果您更改了子类的定义,那么只需确保您了解正在发生的事情。