我试图在VB.NET中创建一个类继承一个基本的抽象类,并实现一个接口。接口声明一个名为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的属性一切都是好的,但我不想基类实现接口。
编译器错误是:
Class ‘MyFoo’ must implement ‘Property Description() As String’ for interface ‘IFoo’. Implementing property must have matching ‘ReadOnly’ or ‘WriteOnly’ specifiers.
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方法,你必须进行转换以获得子实现:
Trace.WriteLine(DirectCast(X,MyFoo).Description)
如果你只是从子类调用MyBase.Description的问题是moot,但如果你改变了子类的定义,那么你只需要确保你明白发生了什么。