我试图在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,但如果你改变了子类的定义,那么你只需要确保你明白发生了什么。