ジェネリックの制約は複数指定が可能なんですね。
Public Class TT(Of T)
Sub New(z as T)
z.GetType()
z.ToString()
End Sub
End Class
これだと, z.GetType()/ToString()といった Object.Methodが使えます。
ジェネリック側で,T-インスタンスを作るときは,
Public Class TT(Of T As New)
Sub New()
Dim z As New T
End Sub
End Class
と書きます。
もっとアプリ的なメソッドの実行をジェネリック側でさせたいときは, MyMethod()を持つクラスMyCls()を作って
Public Class Ta(Of T As MyCls)
Sub New()
Dim z As T
z.MyMethode()
End Sub
End Class
と書いていました。 「as制約は一つのみ」と謂れのない思い込みがあり,
ジェネリック内でのインスタンス生成を諦めたりして,回りくどいコードを書いたりしてました。
ところが,記事をよくよんでいくと, { x,x,x} なるキーワードで複数の制約指定が可能と記載されています。
早速.
'*********
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim zz As cls = Nothing
Dim c As New TCLS(Of cls)(zz)
MessageBox.Show(c.ToString)
End Sub
End Class
'*********
Public Interface AB
Function 加算(ByVal a As Integer, ByVal b As Integer) As Integer
End Interface
'*********
Public Class cls
Inherits List(Of cls)
Implements AB
'*********
Public Function 加算(ByVal a As Integer, ByVal b As Integer) As Integer Implements AB.加算
Return a + b
End Function
End Class
'*********
Public Class TCLS(Of T As {List(Of T), New, AB})
Private wz3 As T
Sub New(ByVal z3 As T)
z3 = New T
wz3 = z3
Dim k1 As New T : z3.Add(k1)
Dim k2 As New T : z3.Add(k2)
Dim j As Integer = z3.加算(3, 4)
Dim cnt As Integer = z3.Count
End Sub
Public Overrides Function ToString() As String
Dim txt As String
txt = "要素数:" + wz3.Count.ToString + vbNewLine
txt += "wz3(34,45)=" + wz3.加算(34, 45).ToString + vbNewLine
txt += "型:" + MyBase.ToString
txt += "型:" + TypeName(wz3)
Return txt
End Function
End Class
このように、インターフェースを活用すれば, ジェネリック側でアプリ的ロジックを持たせられる可能性がでてきました。
メインソースからの,ソースの隔離がより以上に可能になります。
調子に乗って,深みにハマるとシッペ返しがありそうですが, お気に入りの一つになりました。