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

前端之家收集整理的这篇文章主要介绍了VB.NET类继承了一个基类并实现了一个接口问题(在C#中工作)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在VB.NET中创建一个类继承一个基本的抽象类,并实现一个接口。接口声明一个名为Description的字符串属性。基类包含一个名为Description的字符串属性。主类继承基类并实现接口。基类中的描述属性的存在满足接口要求。这在C#中工作正常,但导致VB.NET中的问题。

首先,这里是一个C#代码的示例工作原理:

  1. public interface IFoo
  2. {
  3. string Description { get; set; }
  4. }
  5.  
  6. public abstract class FooBase
  7. {
  8. public string Description { get; set; }
  9. }
  10.  
  11. public class MyFoo : FooBase,IFoo
  12. {
  13. }

现在这里是VB.NET版本,它给出一个编译器错误

  1. Public Interface IFoo
  2. Property Description() As String
  3. End Interface
  4.  
  5. Public MustInherit Class FooBase
  6. Private _Description As String
  7. Public Property Description() As String
  8. Get
  9. Return _Description
  10. End Get
  11. Set(ByVal value As String)
  12. _Description = value
  13. End Set
  14. End Property
  15. End Class
  16.  
  17. Public Class MyFoo
  18. Inherits FooBase
  19. Implements IFoo
  20. 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,然后可以在子类中覆盖它:
  1. Public MustInherit Class FooBase
  2. Private _Description As String
  3. Public Overridable Property Description() As String
  4. Get
  5. Return _Description
  6. End Get
  7. Set(ByVal value As String)
  8. _Description = value
  9. End Set
  10. End Property
  11. End Class
  12.  
  13. Public Class MyFoo
  14. Inherits FooBase
  15. Implements IFoo
  16. Public Overrides Property Description() As String Implements IFoo.Description
  17. Get
  18. Return MyBase.Description
  19. End Get
  20. Set(ByVal value As String)
  21. MyBase.Description = value
  22. End Set
  23. End Property
  24. End Class

编辑
这是对什么@ M.A。 Hanin贴了。我们的两个解决方案工作,但重要的是了解每个的结果。想象下面的代码

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

X.Description中出现了什么?使用Overridable你将获得对子类的调用,同时使用Overload方法,你将得到对基类的调用。既不是对也不错,其理解宣言的后果才是重要的。使用Overload方法,你必须进行转换以获得子实现:

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

如果你只是从子类调用MyBase.Description的问题是moot,但如果你改变了子类的定义,那么你只需要确保你明白发生了什么。

猜你在找的VB相关文章