【问题标题】:Inherits Interface in VB - Porting code from C#在 VB 中继承接口 - 从 C# 移植代码
【发布时间】:2018-05-08 10:57:03
【问题描述】:

所以,我正在使用一个库(Coderr,任何熟悉它的人),它是用 C# 编写的,他们的示例也是如此。我的项目当然是在 VB 中,我对实现他们的示例类的模板有点困惑。

他们现有的一个类的一个例子是here

我尝试手动移植它,但失败了,所以使用 Telerik 的 C# 到 VB 转换器。它输出的代码看起来很不错,而且只需进行一次调整,该类本身就可以很好地工作。除了继承子句。

我现在得到的代码:

Namespace codeRR.Client.AspNet.CurrentUserContext    
    Public Class CurrentUserContext
        Inherits IContextInfoProvider

        Public Function Collect(ByVal context As IErrorReporterContext) As ContextCollectionDTO
            Dim CurrentUser As CurrentUser = CType(HttpContext.Current.Session("CurrentUser"), CurrentUser)
            If CurrentUser Is Nothing Then Return Nothing
            Dim converter = New ObjectToContextCollectionConverter()
            Dim collection = converter.Convert(Name, CurrentUser)
            Return If(collection.Properties.Count = 0, Nothing, collection)
        End Function

        Public ReadOnly Property Name As String
            Get
                Return "CurrentUser"
            End Get
        End Property
    End Class
End Namespace

与示例代码非常相似,但基本上是返回我的自定义对象。 Inherits 行失败:

类只能从其他类继承。

这是有道理的,因为IContextInfoProvider 是一个接口。 我只是坚持我如何在 VB 中实际使用它。我需要将该类插入一个接受IContextInfoProvider 类型对象的函数中。

【问题讨论】:

  • 您可以在 VB 项目中引用 c# 库。为什么不直接将 Coderr 编译成 dll 并作为参考添加呢?
  • 在 VB.NET 中,您使用 Inherits 从基类继承,并使用 Implements 实现接口。
  • 这是带有 C# lisp 的 vb.net 代码 :) 在 vb.net 中,您不能继承接口,只能实现一个接口。顺便说一句,语法很合理。

标签: c# vb.net


【解决方案1】:

该错误可以很好地指示问题所在。虽然一个类可以从另一个类继承,但它不能从接口继承。

继承意味着派生类包含的行为的一些实际实现,以及它的“签名”,而接口只是定义它的“签名”,期望在实现类中实现合适的行为,因此它只能实施。

所以,

Public Class CurrentUserContext
    Inherits IContextInfoProvider

应该是

Public Class CurrentUserContext
    Implements IContextInfoProvider

【讨论】:

  • 虽然这个答案可能是正确的,但更多的文字可能有助于为 OP 和未来的读者澄清事情。
  • @ZoharPeled,中肯的评论。希望我的编辑有所帮助。 :-)。
  • 是的,它确实有帮助。 +1
  • 宾果游戏,成功了。多谢了。是的,额外的细节有助于解释原因,这太棒了。
【解决方案2】:

类可以继承自其他类,也可以实现接口。接口传统上以大写的I 开头,例如IContextInfoProvider

在 C# 中,一个类可以使用相同的语法实现一个接口或从另一个类继承:

// Implement an interface
public class CurrentUserContext : IContextInfoProvider

// Inherit from a class
public class CurrentUserContext : MyContextBaseClass

然而,在 VB.Net 中,实现接口的类或从另一个类继承的类采用两种不同的语法:

' Implement an interface
Public Class CurrentUserContext
    Implements IContextInfoProvider

' Inherit from a class
Public Class CurrentUserContext
    Inherits MyContextBaseClass

在您的情况下,您应该使用Implements 而不是Inherits,因为您正在实现接口而不是从类继承。

我希望这可以解决问题!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2023-01-08
    • 2011-03-24
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多