VB.NET类继承基类并实现接口问题(在C#中工作)

300*_*aud 32 c# vb.net

我试图在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

您需要将您的属性标记为OverridableMustOverride在基类中,然后您可以在子类中覆盖它:

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)