所以,我正在使用一个库(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
类型的对象的函数。
答案 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
,因为您正在实现接口而不是从类继承。
我希望这能解决问题!