【问题标题】:Telling a generic function that it will use an interface with a constructor in vb.net告诉泛型函数它将使用带有 vb.net 中的构造函数的接口
【发布时间】:2011-01-02 15:38:02
【问题描述】:

好的,我一直在尝试在示例项目中使用 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(of T),而且我可能做错了。

【问题讨论】:

    标签: vb.net generics interface


    【解决方案1】:

    语法有点奇怪。您必须使用 { 大括号 } 列出多个约束。像这样:

    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
    

    【讨论】:

    • 谢谢,这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    相关资源
    最近更新 更多