Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

14.7. Casting - DirectCast

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

In onderstaand voorbeeld zien we in Example1 een expressie person1 waarvan het dynamisch type verschillend is van het statisch type.  Het statisch type van person1 is Person, het dynamisch type van person1 is Student.
Visual Basic 2012 Broncode - Codevoorbeeld 379
Option Explicit On
Option Strict On
Class Person
    Public Property Name As String
End Class
Class Student : Inherits Person
    Public Property ClassGroup As String
End Class
Class Example1
    Public Shared Sub Main()
        Dim person1 As Person = New Student With {.Name = "John", _
                                                  .ClassGroup = "VB2008"}
        Console.WriteLine(person1.Name)
        'Console.WriteLine(person1.ClassGroup)  ' compile error
        Console.ReadLine()
    End Sub
End Class
Console Application Output
John
Ondanks de expressie person1 wijst naar een object van het dynamisch type Student, is het toch niet mogelijk via deze ontvangerexpressie de member ClassGroup aan te roepen (1).
Dit is logisch gezien het statisch type van person1 Person is, en de compiler dus zal opzoeken of de member (ClassGroup) die je hierop aanroept zich in de interface (de publieke members) van het type Person bevindt - wat hier niet het geval is.  Want enkel wanneer je een member uit de interface van die klasse (statisch type) aanroept, weet de compiler zeker dat er een implementatie aan kan worden gekoppeld.  Het zal ten slotte minimaal gaan om een object van het type Person waarnaartoe deze expressie verwijst.  Zelfs al gaat het om een object van een afgeleid type waarnaartoe deze expressie verwijst (zoals hier in het voorbeeld waar het dynamisch type verschilt van het statisch type), kan er nog steeds een ( minimaal overgeërfde) implementatie aan worden gekoppeld.

14.7.1. DirectCast

Om het probleem te vermijden waar het niet mogelijk is via een ontvangerexpressie van een bepaald statisch type de members van het eigenlijke dynamisch type aan te roepen kan men gaan casten.
Visual Basic 2012 Broncode - Codevoorbeeld 380
Class Example2
    Public Shared Sub Main()
        Dim person1 As Person = New Student With {.Name = "John", _
                                                  .ClassGroup = "A6-1"}
        Console.WriteLine(person1.Name)
        Console.WriteLine(DirectCast(person1, Student).ClassGroup)
        Console.ReadLine()
    End Sub
End Class
Console Application Output
John
A6-1
Casten is het duidelijk maken aan de compiler dat deze expressie van een ander statisch type moet worden beschouwd dan wat de declaratie of de definitie van deze expressie ervan aangeeft.

Casten kan met het DirectCast keyword, het eerste argument is de expressie die gecast moet worden, de tweede argumentwaarde is de identifier van het type waarnaartoe gecast moet worden.  De DirectCast expressie die zo gevormd wordt, wordt inline gecompileerd en vormt dan eigenlijk een expressie van dat type dat de tweede argumentwaarde opgeeft.
Inline compileren is ervoor zorgen dat de conversiecode deel uitmaakt van de code die deze expressie evalueert.

De expressie person1 heeft als statisch type Person, de expressie DirectCast(person1, Student) heeft als statisch type Student.

Door middel van casting kan men dus het statisch type gaan wijzigen.  Hiermee wordt het dus opnieuw mogelijk de members van het eigenlijke type (dynamisch type) te gaan aanroepen ook al bevindt de expressie zich in de vorm van een basis statisch type van dit eigenlijke dynamisch type.

Men kan enkel neerwaarts en opwaarts in de hiërarchie van de inheritanceketen gaan casten, men spreekt respectievelijk over down- en upcasting.
Andere vormen van casting zijn onzinnig gezien er geen erfelijk verband zal zijn tussen die twee types.

Upcasting (3) is technisch gezien mogelijk, maar weinig zinvol (bij talen met enkel single-inheritance) gezien LSP :
Visual Basic 2012 Broncode - Codevoorbeeld 381
Class Example3
    Public Shared Sub Main()
        Dim student1 As New Student With {.Name = "John", .ClassGroup = "A6-1"}
        Console.WriteLine(student1.Name)                                   ' (2)
        Console.WriteLine(DirectCast(student1, Person).Name)               ' (3)
        Console.ReadLine()
    End Sub
End Class
Console Application Output
John
A6-1
We kunnen reeds op een expressie met statisch type van een afgeleide klasse de members uit de interface aanroepen die zijn overgeërfd uit het basistype ( zoals in regel (2)), dus is het weinig zinvol (zoals in regel (3)) om te gaan casten naar dit basistype.
LSP geeft ons immers reeds aan dat overal waar een expressie van een basistype wordt gebruikt men deze expressie kan vervangen door een van een afgeleid type.

Opgelet : casting is niet hetzelfde als conversie, conversie is het at runtime omzetten van data naar een ander formaat, casting is at compiletime ( of er net voor) aangeven dat een expressie van een ander type moet worden geëvalueerd als het type waaronder de expressie is gedeclareerd of gedefinieerd.

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.