VB.NET ja Generics osa 1. (In Finnish)
Aika paljon verkosta löytyy esimerkkiä Framework 2.0:n yhteydessä genericseistä (koodipohjat lienee ehkä hyvä suomennos) nimenomaan C#:n yhteydessä, mutta VB.NET:n vastaava implementaatio on jäänyt vähemmälle huomiolle. Ajattelinpa nyt sitten täräyttää suomeksi viestin ja antaa tuosta VB.NET:n koodipohjien käytöstä simppelin esimerkin. Esimerkki on testattu/koodattu VS2005:n November CTP:llä.
Esimerkki
Oletetaan, että meillä on seuraavanlainen luokka.
Public Class Item
Private _name As String
Public Sub New(ByVal name As String)
_name = name
End Sub
Public ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
End Class
Haluamme tehdä kyseiselle luokalle oman kokoelmaluokan, joka hyväksyy vain luokan tyypin omaavia objekteja. "Vanhassa" .NET:ssä tämä olisi suunnilleen mennyt näin.
Public Class ItemCollection
Inherits CollectionBase
Protected Overrides Sub OnValidate(ByVal value As Object)
MyBase.OnValidate(value)
If Not value.GetType() Is GetType(Item) Then
Throw New ArgumentException("ItemCollection accepts only objects of type Item")
End If
End Sub
Public Sub Add(ByVal item As Item)
Me.InnerList.Add(item)
End Sub
'... implementointi muille metodeille
End Class
Esimerkki, jossa käytetään kyseistä kokoelmaluokkaa ja yritetään kiertää sen tyypitystä.
Public Class TestObject1
Private _items As ItemCollection
Public ReadOnly Property Items() As ItemCollection
Get
If _items Is Nothing Then
_items = New ItemCollection()
End If
Return _items
End Get
End Property
Public Shared Sub Main()
'Käytetään tyypitetysti
Dim test As New TestObject1
test.Items.Add(New Item("Item 1"))
test.Items.Add(New Item("Item 2"))
test.Items.Add(New Item("Item 3"))
'Loopataan läpi kaikki kokoelman objektit
For Each item As Item In test.Items
Console.WriteLine("Here we have:" & item.Name)
Next
'Yritetään kiertää tyypitystä
Dim itemcoll As ItemCollection = test.Items
'CollectionBasen OnValidatessa tämä yritys napataan ja heitetään herja
CType(itemcoll, IList).Add("Something")
Console.ReadLine()
End Sub
End Class
Sama koodipohjia käyttäen uudessa VB:ssä
Genericsit helpottavat elämää todella, nimittäin em. CollectionBasen tyylinen esimerkki voidaan supistaa todella pieneen. Importataan vain System.Collections.Generic -nimiavaruus, otetaan käyttöön sieltä valmiiksi implementoitu List-luokka (vastaa tavallista ArrayListiä toiminnallisuudeltaan) ja annetaan sille argumenttina haluttu rajaava tyyppi. Kokonaisuudessaan tyypitetyn kokoelman tekeminen voidaan typistää seuraavaan riviin:
Private _list As New List(Of Item)
Ja edelleen edellinen esimerkki voitaisiin kirjoittaa seuraavasti
Public Class TestObject2
Private _items As List(Of Item)
Public ReadOnly Property Items() As List(Of Item)
Get
If _items Is Nothing Then
_items = New List(Of Item)
End If
Return _items
End Get
End Property
Public Shared Sub Main()
Dim test As New TestObject2
test.Items.Add(New Item("Item 1"))
test.Items.Add(New Item("Item 2"))
test.Items.Add(New Item("Item 3"))
'Loopataan läpi kaikki kokoelman objektit
For Each item As Item In test.Items
Console.WriteLine("Here we have:" & item.Name)
Next
&nb