2011-01-02 3 views
1

さて、私は例プロジェクトでvb.netのジェネリックスを使いこなしています。現時点では、次のようになります。vb.netのコンストラクタとのインターフェイスを使用する一般的な関数を教えてください

私はIRow(およびそれをDatarowとして実装するクラス)というインターフェースを持っています。

第2のインターフェースは次のようになり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 

は、私は私の問題は、私はどのようにコンストラクタを持っている、それは(Tの)ICanGetByRowを取得する汎用的な機能を伝えるには考えているということだと思う、と私はおそらく間違ったことをやっています。

答えて

2

構文は少しばかりですが、奇妙です。あなたは{中括弧}で複数の制約を列挙しなければなりません。このように:

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 
+1

ありがとう、それは私が探していたものでした。 – Lambda

関連する問題