|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
11.6.1. Initialisatie VeldenBij het creëren van een object van een bepaalde klasse, zullen eerst de velden geïnitialiseerd worden, waarna de constructor wordt uitgevoerd. Visual Basic 2010 Broncode 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() m_Value2 = ValuesStore.GetValue( "m_Value2") End Sub Private m_Value1 As String = ValuesStore.GetValue( "m_Value1") Private m_Value2 As String Private m_Value3 As String = ValuesStore.GetValue( "m_Value3") End Class Class Example Public Shared Sub Main() Dim someObject As New AClass Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output GetValue : m_Value1
GetValue : m_Value3
GetValue : m_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 2010 Broncode 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() m_Values = New String() { "Class2.Value(0)", _ "Class2.Value(1)", _ "Class2.Value(2)"} End Sub Private m_Values As String() Public Overrides Function Value() As String Value = m_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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 m_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. boven
11.6.2. MyClass KeywordIn 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 2010 Broncode 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() m_Values = New String() { "Class2.Value(0)", _ "Class2.Value(1)", _ "Class2.Value(2)"} End Sub Private m_Values As String() Public Overrides Function Value() As String Value = m_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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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 2010 Broncode 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() m_Values = New String() { "Class2.Value(0)", _ "Class2.Value(1)", _ "Class2.Value(2)"} End Sub Private m_Values As String() Public Overrides Function Value() As String Value = m_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 ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Class1
Class1
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|