Сообщая универсальной функции, что она будет использовать интерфейс с конструктором в vb.net - PullRequest
1 голос
/ 02 января 2011

Хорошо, я пытался поиграть с дженериками в 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), который имеет конструктор, и я, вероятно, делаю это неправильно.

1 Ответ

2 голосов
/ 02 января 2011

Синтаксис немного, ну, странно.Вы должны перечислить несколько ограничений с помощью {фигурных скобок}.Как это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...