梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
HotelCurrencyTrader。
Implementing HotelCurrencyTrader
The difference in features between HotelCurrencyTrader and ActiveCurrencyTrader is the
existence of a sizable spread。
Adding a Constructor to HotelCurrencyTrader
Again�察�we¨ll begin by adding a constructor。 The HotelCurrencyTrader constructor needs an
additional parameter value referencing a spread。 Following is the code for the
HotelCurrencyTrader class�察�including its constructor。
Public Class HotelCurrencyTrader
Inherits CurrencyTrader
Private _fromCurrency As String
Private _toCurrency As String
Private _spread As Double
Public Sub New ��ByVal currExchange As Double�察�ByVal spread As Double�察�
ByVal fromCurrency As String�察�ByVal toCurrency As String��
ExchangeRate = currExchange
_fromCurrency = fromCurrency
_toCurrency = toCurrency
_spread = spread
End Sub
Public ReadOnly Property FromCurrency�┌� As String
Get
Return _fromCurrency
End Get
End Property
Public ReadOnly Property ToCurrency�┌� As String
Get
Return _toCurrency
End Get
End Property
End Class
´´´´´´´´´´´´´´´´´´´´´´Page 178´´´´´´´´´´´´´´´´´´´´´´´
156 CH AP T E R 6 * L E A R N IN G T HE B AS IC S O F OB J E CT OR I E N T E D P R O G R AM M IN G
In the constructor of HotelCurrencyTrader�察�you can see the additional parameter spread。
The spread parameter is assigned to the data member _spread and represents a calculation
that modifies the exchange rate。
Adding the Conversion Methods to HotelCurrencyTrader
Remember in the previous section how the methods ConvertTo�┌� and ConvertFrom�┌� seemed
to add no extra value。 For HotelCurrencyTrader�察�they will add value and illustrate why it is useful
to create indirect exposure。 Calculating what people will receive for their currency depends on
the exchange rate�察�and in the case of the hotel�察�the exchange rate has a spread。 As explained
earlier in this chapter�察�this means you will never get as much as you hoped and will always pay
more than you expected。
The following is the source code for the HotelCurrencyTrader implementations of
ConvertTo�┌� and ConvertFrom�┌�。
Public Class HotelCurrencyTrader
Inherits CurrencyTrader
Private _fromCurrency As String
Private _toCurrency As String
Private _spread As Double
Public Sub New ��ByVal currExchange As Double�察�ByVal spread As Double�察�
ByVal fromCurrency As String�察�ByVal toCurrency As String��
ExchangeRate = currExchange
_fromCurrency = fromCurrency
_toCurrency = toCurrency
_spread = spread
End Sub
Public ReadOnly Property FromCurrency�┌� As String
Get
Return _fromCurrency
End Get
End Property
Public ReadOnly Property ToCurrency�┌� As String
Get
Return _toCurrency
End Get
End Property
Public Function ConvertTo��ByVal value As Double�� As Double
Dim realExchange As Double = ExchangeRate
ExchangeRate = realExchange _spread
Dim retval As Double = ConvertValue��value��
ExchangeRate = realExchange
Return retval
End Function
´´´´´´´´´´´´´´´´´´´´´´Page 179´´´´´´´´´´´´´´´´´´´´´´´
CH A PT E R 6 * L E A R N I N G T HE B AS IC S O F O B J E CT OR I E N TE D P R O G R AM M IN G 157
Public Function ConvertFrom��ByVal value As Double�� As Double
Dim realExchange As Double = ExchangeRate
ExchangeRate = realExchange �� _spread
Dim retval As Double = ConvertValueInverse��value��
ExchangeRate = realExchange
Return retval
End Function
End Class
The ConvertTo�┌� and ConvertFrom�┌� methods have the added logic in that the spread will
be added or subtracted from the exchange rate。 The methods read the current exchange rate�察 �
assign it to a temporary variable�察�define a new exchange rate taking into account the spread�察 �
calculate the currency�察�and then reassign the exchange rate。
The ConvertTo�┌� and ConvertFrom�┌� methods swap values to achieve the desired calcula
tions。 There is absolutely nothing wrong with doing this�察�and you will often swap values in your
own code。 What is important is to restrict access on what classes can do this。 Because ExchangeRate
is a property with protected access�察�it means only those classes that subclass can assign and
change the value of ExchangeRate。 And this implies that the class doing the subclassing knows
what it is doing to the data。 It is a valid assumption and one that you can use to your benefit。
The caller is not aware of this swapping�察�because HotelCurrencyTrader is taking advantage of
the object´oriented technique to not expose the state of the type。
That¨s it!we¨re finished with the currency exchange application。 For the remainder of
this chapter�察�I will fill in some extra details that are important。
Learning More About Preprocessor Directives�察 �
Properties�察�and the MustOverride Keyword
Some details about preprocessor directives�察�properties�察�and the MustOverride keyword that did
not e up in this chapter¨s example are worth mentioning。 These are things you should
know about when writing your own code。
More Preprocessor Directive Details
Earlier in the chapter�察�you saw how you can use the hash character ��#�� and conditional state
ments to conditionally include code during pilation。 The technical term for this jargon is
called preprocessing the code�察�and the statements are called preprocessor directives。 Table 6´1
shows the preprocessor directives you can use。
Table 6´1。 Available Preprocessor Directives
Hash Code Description
#Const Used to define the pilation identifier�察�such as the INTEGRATE_TESTS
identifier used in this chapter¨s example。 You would define this at the top
of a source code file to activate conditional preprocessor statements
used throughout the source code file。 Using a #Const directive does not
span multiple source code files。
#If and #End If Used to conditionally include or not include a piece of source code。 You
would use a conditional directive whenever you wanted to define source
code configurations�察�such as for debug or production builds。
´´´´´´´´´´´´´´´´´´´´´´Page 180´´´´´´´´´´´´´´´´´´´´´´´
158 CH AP T E R 6 * L E A R N IN G T HE B AS IC S O F OB J E CT OR I E N T E D P R O G R AM M IN G
Table 6´1。 Available Preprocessor Directives ��Continued��
Hash Code Description
#ElseIf Instead of a single #If block�察�you could have multiple tests for code
inclusion。 You would use #ElseIf when you have more than a single
preprocessor directive�察�such as for debug�察�production�察�and performance
builds。
#Else A default code block that is included if the other #If statements did