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

11.6. Static Binding via MyClass

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.

11.6.1. Initialisatie Velden

Bij het creëren van een object van een bepaalde klasse, zullen eerst de velden geïnitialiseerd worden, waarna de constructor wordt uitgevoerd.
Visual Basic 2012 Broncode - Codevoorbeeld 325
Namespace FieldInitialization
    Module ValuesStore
        Public Function GetValue(ByVal message As String) As String
            Console.WriteLine("GetValue : " & message)
            GetValue = "SomeValue"
        End Function
    End Module
    Class AClass
        Public Sub New()
            _Value2 = ValuesStore.GetValue("_Value2")
        End Sub
        Private _Value1 As String = ValuesStore.GetValue("_Value1")
        Private _Value2 As String
        Private _Value3 As String = ValuesStore.GetValue("_Value3")
    End Class
    Class Example
        Public Shared Sub Main()
            Dim someObject As New AClass
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
GetValue : _Value1
GetValue : _Value3
GetValue : _Value2
Men moet ook steeds in gedachte houden dat bij het creëren van een object eerst de constructor van de basisklasse wordt uitgevoerd, nog vooraleer de constructor van de klasse zelf (die geïnstantieerd wordt) wordt uitgevoerd.

Dit kan echter tot subtiele fouten leiden bij inheritance.

Bestudeer eens onderstaande code en probeer te voorspellen wat er zal gebeuren.
Visual Basic 2012 Broncode - Codevoorbeeld 326
Namespace DynamicBinding
    Class Class1
        Public Sub New()
            Console.WriteLine(Value())
        End Sub
        Public Overridable Function Value() As String
            Value = "Class1.Value"
        End Function
    End Class
    Class Class2 : Inherits Class1
        Public Sub New()
            _Values = New String() {"Class2.Value(0)", _
                                     "Class2.Value(1)", _
                                     "Class2.Value(2)"}
        End Sub
        Private _Values As String()
        Public Overrides Function Value() As String
            Value = _Values(1)
        End Function
    End Class
    Class Example
        Public Shared Sub Main()
            Dim object1 As Class1 = New Class1
            Dim object2 As Class2 = New Class2
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Op het eerste zicht zou je hier verwachten dat de objectinitializer New Class2 ervoor zal zorgen dat "Class2.Value(1)" op de console wordt geschreven.
Toch is dit niet het geval, bij uitvoer van bovenstaand voorbeeld krijgen we een runtimefout.

De call naar member Value in de constructor van de basisklasse Class1 wordt dynamisch gebonden aan de implementatie voor Value die gedefinieerd is in de klasse Class2.
Het veld _Values waarvan de Value implementatie in Class2 gebruikt maakt is nog niet geïnitialiseerd op het moment dat de constructor van de basisklasse Class1 wordt uitgevoerd.  Hierdoor wordt een runtimefout veroorzaakt.

Het probleem zou niet opgelost worden door het veld meteen te initialiseren bij declaratie.  Ook deze initialisatie zou pas na het uitvoeren van de constructor van de basisklasse Class1 worden uitgevoerd.

Dit is een probleem die niet in alle OOPs zou voorkomen.  Sommige OOPs gebruik altijd statische binding voor membercalls die gebeuren in de constructor.  En dit net om bovenvermelde problemen te vermijden.

11.6.2. MyClass Keyword

In Visual Basic waar ook voor membercalls in de constructor dynamic binding wordt gebruikt, kan men gebruikt maken van het MyClass keyword om bovenvermelde problemen te vermijden.  Hierdoor zal steeds static binding worden gebruikt.
Visual Basic 2012 Broncode - Codevoorbeeld 327
Namespace StaticBinding1
    Class Class1
        Public Sub New()
            Console.WriteLine(MyClass.Value())
        End Sub
        Public Overridable Function Value() As String
            Value = "Class1"
        End Function
    End Class
    Class Class2 : Inherits Class1
        Public Sub New()
            _Values = New String() {"Class2.Value(0)", _
                                     "Class2.Value(1)", _
                                     "Class2.Value(2)"}
        End Sub
        Private _Values As String()
        Public Overrides Function Value() As String
            Value = _Values(1)
        End Function
    End Class
    Class Example
        Public Shared Sub Main()
            Dim object1 As Class1 = New Class1
            Dim object2 As Class2 = New Class2
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Geeft geen runtimefout.
Console Application Output
Class1
Class1
Let op net als MyBase is MyClass in tegenstelling tot Me slechts een keyword, en geen objectexpressie.  Een constructie als With MyClass ... End With zou bijvoorbeeld niet mogelijk zijn.

Men zou het gebruik van het MyClass keyword kunnen vermijden (al is hier geen reden voor) door een aanroep te doen naar een Private member.
Calls naar Private members worden ten slotte steeds statisch gebonden.
Visual Basic 2012 Broncode - Codevoorbeeld 328
Namespace StaticBinding2
    Class Class1
        Public Sub New()
            Console.WriteLine(getValue())
        End Sub
        Public Overridable Function Value() As String
            Value = getValue()
        End Function
        Private Function getValue() As String
            getValue = "Class1"
        End Function
    End Class
    Class Class2 : Inherits Class1
        Public Sub New()
            _Values = New String() {"Class2.Value(0)", _
                                     "Class2.Value(1)", _
                                     "Class2.Value(2)"}
        End Sub
        Private _Values As String()
        Public Overrides Function Value() As String
            Value = _Values(1)
        End Function
    End Class
    Class Example16
        Public Shared Sub Main()
            Dim object1 As Class1 = New Class1
            Dim object2 As Class2 = New Class2
            '
            Console.ReadLine()
        End Sub
    End Class
End Namespace
Console Application Output
Class1
Class1

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