|
Dit artikel is gepubliceerd op woensdag 28 april 2010 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 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 Class
End NamespaceDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Visual Basic 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 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 Class
End NamespaceDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
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. Terug naar 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 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 Class
End NamespaceDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Geeft geen runtimefout. Visual Basic 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 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 Class
End NamespaceDownload Visual Basic Broncode Bekijk deze Broncode in Visual C#
Visual Basic Output Class1
Class1
Dit artikel is gepubliceerd op woensdag 28 april 2010 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
Visual Basic 2008 & 2010 Boeken
Berichten
|