Реализация класса ActiveCurrencyTrader
Класс ActiveCurrencyTrader реализует логику биржевого валютного брокер; Для начала добавим ему конструктор.
Добавление конструктора классу ActiveCurrencyTrader
Мы используем конструктор, чтобы привести объект класса ActiveCurrencyTrader
тзддартное состояние. Однако конструктор послужит также и для другой цели: лю-
В класс, создающий экземпляр класса ActiveCurrencyTrader, должен быть уверен,
trc этот экземпляр останется неизменен (immutable), это означает, что однажды при-
; енные ему данные нельзя изменить.
г заметку. Тип string неизменен, поскольку созданная строковая переменная, которой при-:зоено значение, уже не может быть изменена. Обратите внимание на методы, связанные с ти¬пом string, и вы не найдете ни одного, позволяющего изменять содержимое. Неизменный тип хорош потому, что он позволяет вам реализовать объект в стиле "установил и забыл", это "зедотвращает случайное изменение содержимого другими классами. В целом, неизменный тип надежен и предсказуем.
Вот код конструктора:
public class ActiveCurrencyTrader : CurrencyTrader
;rring fromCurrency; string _toCurrency;
public ActiveCurrencyTrader(double currExchange, string fromCurrency, string t:Currency)
ExchangeRate = currExchange; _fromCurrency = fromCurrency; ^toCurrency = toCurrency;
Конструктор имеет три параметра: currExchange, представляющий текущий курс
люты, fromCurrency, означающий исходную валюту (например, USD), и toCurrency,
-^чающий местную валюту (например, EUR). Значения этих трех параметров при-
э сбиваются переменным-членам. Базовому классу присваивается только текущий курс
1ДЮТЫ CurrencyTrader.ExchangeRate.
Определение информационных свойств только для чтения
Г троки, хранящие сведения о том, с какой валюты на какую осуществляется пере-Hi. вполне подходят для информационных целей. Предположим, например, что у вас -семпляры пар валют, чтобы брокер мог просмотреть пары валют, в которых будут рсдставлены значения fromCurrency и _toCurrency. Это означает, что строки валют гут свойствами только для чтения, их код выглядит следующим образом:
public class ActiveCurrencyTrader : CurrencyTrader
scring _fromCurrency; ;~ring _toCurrency;
public ActiveCurrencyTrader(double currExchange, string fromCurrency, string ":Currency)
ExchangeRate = currExchange; _fromCurrency = fromCurrency; _toCurrency = toCurrency;
public string FromCurrency
{
get {
return _fromCurrency; } }
public string ToCurrency { get {
return _toCurrency; } > }
Имена свойств очень похожи на имена переменных-членов (FromCurrer.; _ и ToCurrency). Я сделал это для того, чтобы знать, для чего предназначен каждый фраг¬мент кода. Мой подход подразумевает использование в начале символа подчеркивание в именах закрытых переменных-членов, но вы можете использовать другую форму за¬писи, если хотите. .
Добавление методов преобразования
Для завершения класса ActiveCurrencyTrader необходимо добавить функции пре-образования значений для пары валют вперед и назад. Класс ActiveCurrencyTrader использует точное значение курса обмена валют. Методы ConvertValue и ConvertValuelnverse () имеют область видимости protected, а следовательно, он;: недоступны извне. Класс ActiveCurrencyTrader должен определить пару открытых ме¬тодов, которые обращаются к защищенным методам. Вот полная реализация классе ActiveCurrencyTrader:
public class ActiveCurrencyTrader : CurrencyTrader {
string _fromCurrency;
string __toCurrency;
public ActiveCurrencyTrader(double currExchange, string fromCurrency, string toCurrency) { ExchangeRate = currExchange;
fromCurrency = fromCurrency; ^toCurrency = toCurrency; }
public string FromCurrency {
get
{ return _fromCurrency;
} }
public string ToCurrency {
get
{ return ^toCurrency;
} }
public double ConvertTo(double value) гэ-urn ConvertValue(value);
public double ConvertFrom(double value) return ConvertValuelnverse(value);
":лы ConvertTo () и ConvertFrom() — это оболочки методов ConvertValue () ■■srzValuelnverse (), без всяких добавок. Вспомните проблему кассира, кредитной •ки и доверия. Одной схожести ситуации, по правде говоря, недостаточно, вы пи-
- :z. выступающий в роли кассира и обеспечивающий вам гибкость. едположим, например, что методы CurrencyTrader .ConvertValue () и Currency-: . -cr.vertValualnverse 0 были объявлены как public, а не как protected. В этом
- т:-:5ой пользователь класса ActiveCurrencyTrader мог бы использовать функци-вые возможности, предоставляемые классом CurrencyTrader. Предположим, что
решил изменить функции ConvertValue () и ConvertValuelnverse (). Это созда-щ : ".темы, поскольку изменения в классе CurrencyTrader автоматически распро-сгась бы на класс ActiveCurrencyTrader. Определяя собственные методы, вы га-тге. что если в будущем что-то изменится, вы сможете адаптировать различия
- есения изменений в вызывающую сторону класса ActiveCurrencyTrader.
■" трь. завершив функции класса ActiveCurrencyTrader, давайте реализуем класс . - - rencyTrader.