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

前端之家收集整理的这篇文章主要介绍了VB.NET类继承了一个基类并实现了一个接口问题(在C#中工作)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在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,但如果你改变了子类的定义,那么你只需要确保你明白发生了什么。

猜你在找的VB相关文章