Welcome to AspAdvice Sign in | Join | Help

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