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

35.4. Overloading van Methods met Optionele Parameters

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.

Veronderstel dat we in ons systeem reeds over een Login method beschikken.  Bij een call naar deze method word een username doorgegeven, eventueel wordt ook een theme uitgekozen (2):
Visual Basic 2012 Broncode - Codevoorbeeld 846
Namespace OverloadingOptionalParameters
    Class Shop
        Public Sub Login(username As String,
                         Optional theme As Theme = Theme.Dark)
            '...
        End Sub
    End Class
    Enum Theme
        Dark
        Light
    End Enum
    Class Client
        Public Shared Sub Main()
            Dim shop1 As New Shop
            shop1.Login("John", Theme.Light)                              ' (2)
            '...
        End Sub
    End Class
End Namespace
Als we nu bij een update ook een Login wensen waar naast de username en optionele theme eventueel ook nog een password wordt voorzien, dan zouden we hiervoor graag simpelweg een method kunnen toevoegen.  Deze method zou er zo kunnen uitzien:
Visual Basic 2012 Broncode - Codevoorbeeld 847
Namespace OverloadingOptionalParameters
    Partial Class Shop
        Public Sub Login(username As String,
                         Optional theme As Theme = Theme.Dark,
                         Optional password As String = "")
            '...
        End Sub
    End Class
    Class Client2
        Public Shared Sub Main()
            Dim shop1 As New Shop
            shop1.Login("Administrator", Theme.Dark, "admin")             ' (3)
            shop1.Login("Jane", , "arsldfj")                              ' (4)
            '...
        End Sub
    End Class
End Namespace
Deze code zal echter in Visual Basic 2010 (of lager) een compilefout veroorzaken:
Public Sub Login(username As String, [theme As Theme = Theme.Dark])
and
Public Sub Login(username As String, [theme As Theme = Theme.Dark], [password As String = ""])

cannot overload each other because they differ only by optional parameters.
Ergens begrijpelijk, maar toch vervelend.

We kunnen dit natuurlijk oplossen door voor de vier verschillende situaties (username (1), username+theme (2), username+theme+password (3) en username+password (4)) vier verschillende overladende Login methods uit te schrijven:
Visual Basic 2012 Broncode - Codevoorbeeld 848
Namespace SimplyByOverloading
    Class Shop
        Public Sub Login(username As String)
            '...
        End Sub
        Public Sub Login(username As String, theme As Theme)
            '...
        End Sub
        Public Sub Login(username As String, theme As Theme, password As String)
            '...
        End Sub
        Public Sub Login(username As String, password As String)
            '...
        End Sub
    End Class
    Enum Theme
        Dark
        Light
    End Enum
    Class Client
        Public Shared Sub Main()
            Dim shop1 As New Shop
            shop1.Login("Visitor")                                        ' (1)
            shop1.Login("John", Theme.Light)                              ' (2)
            shop1.Login("Administrator", Theme.Dark, "admin")             ' (3)
            shop1.Login("Jane", "arsldfj")                                ' (4)
            '...
        End Sub
    End Class
End Namespace
Maar toch hadden we liever voor die ene extra factor (wat het password is) gewoon graag één extra functionaliteit (lees method) gedefinieerd.

Wel in Visual Basic 2012, ook wel Visual Basic 11 genoemd, is dit mogelijk.  We bekomen geen compilefout meer in het scenario zoals in voorbeeld OverloadingOptionalParameters omschreven.

Ook bij volgend voorbeeld krijgen we geen compilefout meer in Visual Basic 2012, terwijl we opnieuw bij de overladen Test methods enkel een verschil in de Optional argumenten hebben:
Visual Basic 2012 Broncode - Codevoorbeeld 849
Class Example
    Public Shared Sub Test(arg1 As Integer)
        Console.WriteLine("Hello")
    End Sub
    Public Shared Sub Test(arg1 As Integer,
                           Optional arg2 As Integer = 2)
        Console.WriteLine("World")
    End Sub
    Public Shared Sub Test(arg1 As Integer,
                           Optional arg2 As Integer = 2,
                           Optional arg3 As Integer = 3)
        Console.WriteLine("!!!")
    End Sub
    Public Shared Sub Main()
        Test(10)           ' Hello
        Test(10, 20)       ' World
        Test(10, 20, 30)   ' !!!
        Test(10, , 30)     ' !!!
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
Hello
World
!!!
!!!
Steeds zal de compiler de "best passende" method uitkiezen.  In principe is de stelregel de method uit te kiezen waarbij zo weinig mogelijk Optional parameters niet zijn ingevuld.

Toch moet je opletten.  Het kan niet alleen verwarrende code opleveren, maar ook leiden tot een aantal problemen.
Zo is het in ons OverloadingOptionalParameters voorbeeld met de twee overladen Login methods niet mogelijk om enkel een username als parameterwaarde te voorzien:
Visual Basic 2012 Broncode - Codevoorbeeld 850
Namespace OverloadingOptionalParameters
    Class Client3
        Public Shared Sub Main()
            Dim shop1 As New Shop
            shop1.Login("Visitor")                                        ' (1)
            '...
        End Sub
    End Class
End Namespace
Regel (1) veroorzaakt een compilefout:
Overload resolution failed because no accessible 'Login' is most specific for these arguments:

Public Sub Login(username As String,
                 [theme As Theme = Theme.Dark],
                 [password As String = ""]): Not most specific.

Public Sub Login(username As String,
                 [theme As Theme = Theme.Dark]): Not most specific.
Logischerwijs moet hier inderdaad wel een fout gegeven worden.  De compiler kan immers nergens uit afleiden welke Login method je wenst aan te roepen.
Wat dan weer op te lossen zou zijn door nog een Login toe te voegen met slechts één parmeter (username).  Om dezelfde reden is er in klasse Example een Test met één parameter aanwezig.

Hier zorgt het toevoegen van een method via method overloading dus niet alleen voor het toevoegen van een mogelijkheid (tot aanroepen van een method met deze naam), maar anderzijds ook tot het beperken van een mogelijkheid.  Je kunt je de vraag stellen of deze taalkundige aanpassing wel meer voordelen dan nadelen heeft.

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