我正在尝试在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不能处理此问题,还是需要在某个地方更改语法才能使其正常工作?

最佳答案

您需要在基类中将属性标记为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

编辑
这是对@ 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,那么这个问题就没有意义了,但是,如果您更改了子类的定义,那么只需确保您了解正在发生的事情。

10-08 07:58
查看更多