Zu 1. Hier ist eine sehr einfache generische Klasse
Public Class SimpleGenericClass(Of T)
Private _value As T
Public Sub New(ByVal parm As T)
_value = parm
End Sub
Public ReadOnly Property Val() As T
Get
Return _value
End Get
End Property
End Class Und so kann ich das benutzen:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Dim sgcint As New SimpleGenericClass(Of Integer)(3)
Debug.WriteLine(sgcint.Val.ToString())
Dim sgcstr As New SimpleGenericClass(Of String)("abc")
Debug.WriteLine(sgcstr.Val)
End Sub Bei Public Class SimpleGenericClass(Of T) ist T ein Type als Parameter der Instanzierung. Die Variable _value, Property Val und Parameter parm im Constructor sind dann alle vom Typ T.
Das ist natürlich nicht besonders nützlich. Bei einer Klasse wie ArrayList aber sind alle Elemente vom Typ Objekt, was nicht typsicher ist, und bei Value Werten zu Boxing/Unboxing führt. Eine generische ArrayList könnte man z.B. als New ArrayList(Of Integer) anlegen, wobei die Elemente dann vom Typ Integer wären. MS hat ArrayList allerdings nicht als generische Klasse implementiert. Generic.Collection(Of T) war eingentlich ein schlechtes Beispiel (mir ist das Thema ja auch relativ neu), die Klasse soll eher als Basisklasse dienen. Es gibt aber List(Of T) was eine etwas erweiterte ArrayList Klasse ist.
Hier ist ein kleines Beispiel von List(Of T)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
Dim l1 As New List(Of Integer)
l1.Add(1)
l1.Add(2)
l1.Add(3)
l1.Add(8)
l1.Add(17)
l1.Add(59)
l1(1) = 44
For Each i As Integer In l1
Debug.WriteLine(i.ToString())
Next
Dim l7To44 As List(Of Integer) = l1.FindAll(AddressOf New FindBetween( _
7, 44).Find)
For Each i As Integer In l7To44
Debug.WriteLine(i.ToString())
Next
End Sub
Private Class FindBetween
Private _numLow As Integer
Private _numHigh As Integer
Public Sub New(ByVal low As Integer, ByVal high As Integer)
_numLow = low
_numHigh = high
End Sub
Public Function Find(ByVal val As Integer) As Boolean
If val >= _numLow AndAlso val <= _numHigh Then Return True
End Function
End Class
End Class List(Of T).FindAll() nimmt ein System.Predicate(Of T). Hier wird es verwendet um Elemente zwischen zwei Nummern auszuwählen, aber jedes Auswahlkriterium könnte benutzt werden.
Man könnte FindBetween auch als generisch definieren, allerdings wird das ein wenig komplizierter wenn man etwas besonders mit den Objekten anfangen will, da VB natürlich keine Ahnung hat wozu ein "T" alles fähig ist. Es geht z.B. so:
Private Class findBetween(Of T As IComparable)
Private _numLow As T
Private _numHigh As T
Public Sub New(ByVal low As T, ByVal high As T)
_numLow = low
_numHigh = high
End Sub
Public Function Find(ByVal val As T) As Boolean
If val.CompareTo(_numLow) > -1 AndAlso val.CompareTo(_numHigh) < _
1 Then Return True
End Function
End Class Das Klassenobjekt wird dann mit
New FindBetween(Of Integer)(7, 44) angelegt (in diesem Beispiel). Und T könnte irgendeine Klasse sein, die IComparable implementiert. |