我试图在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
{
}
Run Code Online (Sandbox Code Playgroud)
现在这是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
Run Code Online (Sandbox Code Playgroud)
如果我使基类(FooBase)实现接口并添加Implements IFoo.Description到属性一切都很好,但我不希望基类实现接口.
编译器错误是:
类'MyFoo'必须为接口'IFoo'实现'Property Description()As String'.实现属性必须具有匹配的"ReadOnly"或"WriteOnly"说明符.
VB.NET可以不处理这个问题,还是我需要在某处更改我的语法才能使其工作?
Chr*_*aas 22
您需要将您的属性标记为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
Run Code Online (Sandbox Code Playgroud)
编辑 这是对@MA Hanin发布的回应.我们的两个解决方案都有效,但了解每个解决方案的后果非常重要.想象一下以下代码:
Dim X As FooBase = New MyFoo()
Trace.WriteLine(X.Description)
Run Code Online (Sandbox Code Playgroud)
什么来自X.Description?使用Overridable,您将使用Overload方法调用子类,您将获得对基类的调用.无论是对还是错,它对于理解宣言的后果非常重要.使用重载方法,您必须向上转换以获取子实现:
Trace.WriteLine(DirectCast(X, MyFoo).Description)
Run Code Online (Sandbox Code Playgroud)
如果您只是从子类调用MyBase.Description,那么这个问题没有实际意义,但如果您更改了子类的定义,那么您只需要确保了解正在发生的事情.
M.A*_*nin 11
无论如何,您必须指定IFoo接口的实现细节.
这个简单的选择怎么样?
Public Class MyFoo
Inherits FooBase
Implements IFoo
Overloads 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54973 次 |
| 最近记录: |