按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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 153
Public Class ActiveCurrencyTrader
Inherits CurrencyTrader
Private _fromCurrency As String
Private _toCurrency As String
Public Sub New(ByVal currExchange As Double; ByVal fromCurrency As String;
ByVal toCurrency As String)
ExchangeRate = currExchange
_fromCurrency = fromCurrency
_toCurrency = toCurrency
End Sub
End Class
The constructor has three parameters: currExchange represents the current exchange rate;
fromCurrency indicates the source currency (for example; USD); and toCurrency indicates the
destination currency (for example; EUR)。 These three parameters are assigned to data members;
whereby only the current exchange rate is assigned to the base class
CurrencyTrader。ExchangeRate。
Defining Informational Read…Only Properties
The characters that represent the from currency and to currency are stored as strings; and are
purely for informational purposes。 For example; let’s say that you have instantiated a bunch of
currency pairs so that the trader can prehend the currency pair in which the values of
_fromCurrency and _toCurrency will be presented。 This means that the currency strings are
read…only properties and are coded as follows:
Public Class ActiveCurrencyTrader
Inherits CurrencyTrader
Private _fromCurrency As String
Private _toCurrency As String
Public Sub New (ByVal currExchange As Double;
ByVal fromCurrency As String; ByVal toCurrency As String)
ExchangeRate = currExchange
_fromCurrency = fromCurrency
_toCurrency = toCurrency
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 176……………………………………………………………
154 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
The naming of the properties ( FromCurrency and ToCurrency) corresponds closely to the
naming of the data members (_fromCurrency and _toCurrency)。 I do this throughout my code
so that I know what each piece of code means。 My convention is to use a leading underscore to
name private data members; but you can use a different notation if you prefer。
Adding the Conversion Methods
The last step to make the ActiveCurrencyTrader class plete is to add the functionality to
convert a value from or to a currency pair。 The ActiveCurrencyTrader class will use the exact
currency exchange rate。 The ConvertValue(); and ConvertValueInverse() methods have protected
scope; and thus are not exposed outside the inheritance hierarchy。 ActiveCurrencyTrader
needs to define a pair of publicly scoped methods that will call the protected scope methods。
The following is the plete ActiveCurrencyTrader implementation。
Public Class ActiveCurrencyTrader
Inherits CurrencyTrader
Private _fromCurrency As String
Private _toCurrency As String
Public Sub New (ByVal currExchange As Double;
ByVal fromCurrency As String; ByVal toCurrency As String)
ExchangeRate = currExchange
_fromCurrency = fromCurrency
_toCurrency = toCurrency
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
Return ConvertValue(value)
End Function
Public Function ConvertFrom(ByVal value As Double) As Double
Return ConvertValueInverse(value)
End Function
End Class
The ConvertTo() and ConvertFrom() methods are wrappers to the ConvertValue() and
ConvertValueInverse() methods; and provide no added value。 But remember the problem of
the cashier and credit card。 Just because it seems like there is no added value; the reality is that
you are writing code that is acting as a gatekeeper and giving yourself flexibility。
…………………………………………………………Page 177……………………………………………………………
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 155
For example; suppose that CurrencyTrader。ConvertValue(); and CurrencyTrader。
ConvertValueInverse() were declared using Public rather than Protected。 Then any user of
ActiveCurrencyTrader could use the functionality exposed by CurrencyTrader。 Suppose someone
decided to change the functionality of ConvertValue() and ConvertValueInverse()。 At that
point; you would have problems; because the changes to CurrencyTrader automatically imply
changes in ActiveCurrencyTrader。 By defining your own methods; you are controlling and
making sure that if things change in the future; you can acmodate them without needing
to change the callers of ActiveCurrencyTrader。
We have now pleted the functionality of ActiveCurrencyTrader; so let’s implement
HotelCurrencyTrader。
Implementing HotelCurrencyTrader
The difference in