|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
Indien men in een bepaalde implementatie zowel een ingekapseld veld als een publieke member kan gebruiken om een bepaalde waarde van een object aan te spreken, valt het doorgaans aan te raden deze waarde via de publieke member te benaderen.
Deze publieke member garandeert immers - althans zolang de abstractie van de klasse ongewijzigd blijft - steeds dezelfde waarde op te leveren.
Stel dat we bij het opvragen van de Tax van een Product een percentage wensen te ontvangen : Visual Basic 2010 Broncode Namespace Example1 Module Client Public Sub Main() Dim product1 As New Product product1.Price = 1000 product1.Tax = 21 Console.WriteLine(product1.Tax = 21) Console.WriteLine(product1.GetPriceIncludingTax() = 1210) Console.ReadLine() End Sub End ModuleEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output True
True Dan kunnen we bijvoorbeeld deze ingestelde Tax waarde rechtstreeks in het m_Tax veld bewaren : Visual Basic 2010 Broncode Namespace Example1 Class Product Private m_Price As Decimal Public Property Price() As Decimal Get Price = m_Price End Get Set( ByVal value As Decimal) m_Price = value End Set End Property Private m_Tax As Decimal Public Property Tax() As Decimal Get Tax = m_Tax End Get Set( ByVal value As Decimal) m_Tax = value End Set End Property End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Indien we in een GetPriceIncludingTax implementatie de taxwaarde wensen te gebruiken kunnen we deze waarde zowel via Tax als m_Tax deze waarde benaderen.
Toch valt in dergelijke gevallen aan te raden de publieke member te gebruiken om dergelijke waarde aan te spreken. Van Tax zijn we immer zeker dat het steeds dezelfde waarde zal opleveren. We hebben immers in de abstractie vastgelegd dat indien we deze waarde opvragen we het percentage wensen te ontvangen. Visual Basic 2010 Broncode Namespace Example1 Partial Class Product Public Function GetPriceIncludingTax() As Decimal GetPriceIncludingTax = Price * (1 + (Tax / 100)) End Function End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Van m_Tax zijn we echter niet zo zeker, momenteel zal deze dezelfde waarde representeren : Visual Basic 2010 Broncode Namespace Example2 Class Product Private m_Price As Decimal Public Property Price() As Decimal Get Price = m_Price End Get Set( ByVal value As Decimal) m_Price = value End Set End Property Private m_Tax As Decimal Public Property Tax() As Decimal Get Tax = m_Tax End Get Set( ByVal value As Decimal) m_Tax = value End Set End Property Public Function GetPriceIncludingTax() As Decimal GetPriceIncludingTax = Price * (1 + (m_Tax / 100)) End Function End Class Module Client Public Sub Main() Dim product1 As New Product product1.Price = 1000 product1.Tax = 21 Console.WriteLine(product1.Tax = 21) Console.WriteLine(product1.GetPriceIncludingTax() = 1210) Console.ReadLine() End Sub End ModuleEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output True
True We kunnen echter op eender welk moment de implementatie van de property Tax veranderen, en dit zonder de abstractie van het type Product aan te tasten.
We zouden bijvoorbeeld in plaats van het percentage, het effectieve taxbedrag kunnen bewaren : Visual Basic 2010 Broncode Namespace Example3 Class Product Private m_Price As Decimal Public Property Price() As Decimal Get Price = m_Price End Get Set( ByVal value As Decimal) m_Price = value End Set End Property Private m_Tax As Decimal Public Property Tax() As Decimal Get Tax = (m_Tax / Price) * 100 End Get Set( ByVal value As Decimal) m_Tax = Price * (value / 100) End Set End Property End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Indien we de implementatie van GetPriceIncludingTax niet aanpassen, krijgen we een foutief resultaat : Visual Basic 2010 Broncode Namespace Example3 Partial Class Product Public Function GetPriceIncludingTax() As Decimal GetPriceIncludingTax = Price * (1 + (m_Tax / 100)) End Function End Class Module Client Public Sub Main() Dim product1 As New Product product1.Price = 1000 product1.Tax = 21 Console.WriteLine(product1.Tax = 21) Console.WriteLine(product1.GetPriceIncludingTax() = 1210) Console.ReadLine() End Sub End ModuleEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output True
False Indien we in de implementatie van GetPriceIncludingTax toch gewoon de publieke property Tax uitlezen, hebben we geen enkel probleem : Visual Basic 2010 Broncode Namespace Example4 Class Product Private m_Price As Decimal Public Property Price() As Decimal Get Price = m_Price End Get Set( ByVal value As Decimal) m_Price = value End Set End Property Private m_Tax As Decimal Public Property Tax() As Decimal Get Tax = (m_Tax / Price) * 100 End Get Set( ByVal value As Decimal) m_Tax = Price * (value / 100) End Set End Property Public Function GetPriceIncludingTax() As Decimal GetPriceIncludingTax = Price * (1 + (Tax / 100)) End Function End Class Module Client Public Sub Main() Dim product1 As New Product product1.Price = 1000 product1.Tax = 21 Console.WriteLine(product1.Tax = 21) Console.WriteLine(product1.GetPriceIncludingTax() = 1210) Console.ReadLine() End Sub End ModuleEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output True
True
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|