好的,我一直试图在一个示例项目中使用vb.net中的泛型玩具。目前,它看起来像这样:
我有一个名为IRow的接口(以及一个将其实现为Datarow的类)。
第二个界面是ICanGetByRow,如下所示:
Public Interface ICanGetByRow(Of T)
Function GetByRow(ByVal Row As IRow) As T
End Interface
该函数只需要一个IRow并将其转换为T.这很容易。现在,为了便于访问,我想在IRow接口中实现一个函数,它接受行并将其转换为所说的ICanGetByRow。
我的界面通过以下功能进行了增强
Function GetObj(Of T As ICanGetByRow(Of T))() As T
您可能会看到问题所在。如果我像这样实现它:
Public Function GetObj(Of T As ICanGetByRow(Of T))() As T Implements IRow.GetObj
Dim foo As New T
foo.GetByRow(Me)
Return foo
End Function
我不会被允许构造一个新的T,当我试图通过告诉泛型函数我的接口有一个构造函数来使它工作时,他不会让我再调用GetByRow。
Public Function GetObj(Of T As New, ICanGetByRow)() As T Implements IRow.GetObj
Dim foo As New T
foo.GetByRow(Me)
Return foo
End Function
我认为我的问题是我不知道如何告诉泛型函数它会得到一个具有构造函数的ICanGetByRow(T),而且我可能做错了。
答案 0 :(得分:2)
语法有点,好吧,奇怪。您必须使用{braces}列出多个约束。像这样:
Interface ICanGetByRow(Of T)
Sub GetByRow(ByVal arg As IRow)
End Interface
Interface IRow
Function GetObj(Of T As {New, ICanGetByRow(Of T)})() As T
End Interface
Class Impl
Implements IRow
Public Function GetObj(Of T As {New, ICanGetByRow(Of T)})() As T Implements IRow.GetObj
Dim foo As New T
foo.GetByRow(Me)
Return foo
End Function
End Class