gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:08:05 25 4
gpt4 key购买 nike

我正在尝试在 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)。

编译错误是:

Class 'MyFoo' must implement 'Property Description() As String' for interface 'IFoo'. Implementing property must have matching 'ReadOnly' or 'WriteOnly' specifiers.

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. 的回应。哈宁发帖。我们的两种解决方案都有效,但了解每种解决方案的后果很重要。想象一下下面的代码:

Dim X As FooBase = New MyFoo()
Trace.WriteLine(X.Description)

X.Description 的结果是什么?使用 Overridable 您将获得对子类的调用,而使用 Overload 方法您将获得对基类的调用。没有对错,重要的是了解声明的后果。使用 Overload 方法,您必须向上转换才能获得子项的实现:

Trace.WriteLine(DirectCast(X, MyFoo).Description)

如果您只是从子类调用 MyBase.Description,这个问题就没有实际意义了,但是如果您更改了子类的定义,那么您只需要确保您了解发生了什么。

关于c# - VB.NET类继承一个基类并实现一个接口(interface)问题(在C#中工作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2607884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com