在VB中继承接口 - 从C#移植代码

时间:2018-05-08 10:57:04

标签: c# vb.net

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

其中一个现有类的示例是here

我试图手动移植它,然后失败了,所以使用了Telerik的C#到VB转换器。它输出的代码看起来非常好,只有一个调整,这个类本身效果很好。除了inherits子句。

我现在的代码:

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类型的对象的函数。

2 个答案:

答案 0 :(得分:3)

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

继承意味着派生一些Class包含的行为的实际实现,以及它的'signature',而Interface只是定义它的'signature',期望在实现Class中实现合适的行为,因此它只能实施。

所以,

Public Class CurrentUserContext
    Inherits IContextInfoProvider

应该是

Public Class CurrentUserContext
    Implements IContextInfoProvider

答案 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,因为您正在实现接口而不是从类继承。

我希望这能解决问题!