Главная » C# » Наследование и модификаторы области видимости в приложении обмена валют в Visual C# (Sharp)

0

На данном этапе свойство ExchangeRate является механическим свойством, котое будет использоваться любым производным классом класса CurrencyTrader. Поэтому сейчас нам нужно решить, следует ли ограничивать доступ к этому свотву. Правильным решением будет позволить доступ к нему только тем разрабоикам, которые действительно понимают механизм преобразования валют. Доступ должен быть ограничен классами, производными от класса CurrencyTrader. Мифицированный класс CurrencyTrader будет выглядеть таким образом:

public abstract class CurrencyTrader {

private double _exchangeRate;

protected double ExchangeRate { get {

return _exchangeRate;

}

set {

_exchangeRate = value;

}

}

Жирным шрифтом в этом коде выделены определения областей видимости.

• public (общая)—  к  данному  типу,  методу  или  свойству  может  обращаться и иметь доступ любой другой тип. По аналогии с квартирой и посетителями, это будет сродни гостиной, в которую практически любой ваш посетитель может иметь доступ.

• private (частная) — к данному методу или свойству может обращаться и иметь доступ только тип, который его объявил. По аналогии с квартирой и посетитями, это будет сродни вашей спальне, в которую доступ имеете только вы.

• protected (защищенная) — к методу или свойству может обращаться и иметь доступ тип, который его объявил, или производные типы. По аналогии с квартой и посетителями, это будет сродни вашей столовой, в которую доступ имеете вы и приглашенные вами гости.

Типу, методу или свойству, объявленному без указания области видимости, по умолчанию присваивается частная область видимости.

Модификаторы private и protected нельзя присваивать типам. Дополнительная информация о других модификаторах и подробности об объявлениях области вимости типа будет рассмотрена в следующей главе.

Использование наследования для создания другого типа

Модифицированная версия класса CurrencyTrader выведет из строя тестовый код, т. к. в нем используется ключевое слово  abstract, а из абстрактных типов создать экземпляры непосредственно нельзя. Вот код, который не будет работать: CurrencyTrader els = new CurrencyTrader();

els.ExchangeRate = 123.44;

Код не будет работать по двум причинам:

•    класс CurrencyTrader является абстрактным и поэтому не допускает непосретвенного создания экземпляров;

•    свойство ExchangeRate является защищенным и  поэтому не допускает обращия извне.

Это ставит нас в трудное положение. До  настоящего  момента  при  тестировании кода мы полагали, что все фрагменты, подлежащие тестированию, были достуыми. Одним из решений этой проблемы было бы  изменить объявления областей видимости и удалить ключевые слова abstract и protected. Но, в то время как той подход решил бы проблему, это было бы компромиссом. Лучшим подходом будет протестировать класс CurrencyTrader в том виде, в каком его подразевалось использовать, т. е. как наследуемый класс. Таким образом,  решением будет применить механизм наследования и создать производный от класса CurrencyTrader тестовый класс TestCurrencyTrader следующим образом:

class TestCurrencyTrader:CurrencyTrader { public void InitializeExchangeRate() {

ExchangeRate = 100.0;

}

}

Тестовый класс TestCurrencyTrader добавляется к исходному коду. Идентификор наследуемого класса (TestCurrencyTrader) отделяется от идентификатора класса, от которого ОН наследует (CurrencyTrader) с помощью двоеточия.

Чтобы  предоставить доступ  к  методу  внешнему  коду,  применяется  модификатор

public, хотя сам класс public не объявлен.

К идентификаторам базового класса, область видимости которых объявлена protected или public, можно обращаться из производного класса. Например, оатите внимание на то, что переменная ExcahngeRate используется самостоятело,  без  ссылок  на  объект.  Такое  обращение  к  переменной  ExcahngeRate вполне

нормально, т. к. в базовом классе currencyTrader имеется идентификатор с таким именем. К свойству ExchangeRate можно обращаться локально, т. к. оно имеет оасть видимости protected. Идентификатор ExchangeRate подразумевает ссылку this (т. е. this .ExchangeRate), поэтому нет надобности добавлять эту ссылку явно, если только не имеется несколько одинаковых идентификаторов или вы не хотите явно обратиться к определенному идентификатору.

Теперь наши тесты не смогут тестировать класс CurrencyTrader, но смогут тестовать класс TestcurrencyTrader. Последний должен содержать код для верифации, что все работает должным образом.

Области видимости private, protected и public

Теперь рассмотрим более подробно работу этих  трех  типов  области  видимости. Для начала, обсудим реализацию класса CurrencyTrader:

public abstract class CurrencyTrader { private double _exchangeRate;

protected double ExchangeRate { get {

return _exchangeRate;

}

set {

_exchangeRate = value;

}

}

protected double ConvertValue(double input) { return _exchangeRate * input;

}

protected double ConvertValuelnverse(double input) { return input / _exchangeRate;

}

}

От  класса  CurrencyTrade наследуется  НОВЫЙ класс  ActiveCurrencyTrader таким образом:

public class ActiveCurrencyTrader : CurrencyTrader {

}

Так как член данных CurrencyTrader,_exchangeRate объявлен private, ТО обраться к нему можно только из класса CurrencyTrader. Если бы для него не была явно объявлена  область видимости,  то область видимости private подразумевав лась бы неявно. Например, следующий код не скомпилировался бы:

public class ActiveCurrencyTrader : CurrencyTrader { public void Method() {

_exchangeRate = 100.0;

}

}

Класс ActiveCurrencyTrader не является частью класса CurrencyTrader, И поэтому обращение к члену данных _exchangeRate невозможно.

В классе ActiveCurrencyTrader К члену данных ExchangeRate, который был обвлен protected, можно обращаться следующим образом:

public class ActiveCurrencyTrader : CurrencyTrader { public void Method() {

ExchangeRate = 100.0;

}

}

Область видимости protected означает, что только классы, наследуемые от базого класса, могут обращаться к методам, свойствам или членам данных с данной областью видимости. Количество наследований и уровень наследования произвоого класса роли не играют.

Изо всех областей видимости public является наиболее дозволяющей и простой. Она применяется, когда нужно предоставить функциональность, к которой требт доступа другие классы или производные классы данного класса.

Далее приводятся некоторые советы по использованию каждой области видимости.

•   Область видимости private (частная). Применяется для большинства членов данных, т. к. члены данных неявно выражают состояние объекта. Иногда рабую логику разрабатываемого алгоритма необходимо разбить на несколько модов. Так как отдельные методы применяются для решения одной и той же зачи, то их необходимо использовать только в контексте класса, что означает, что их область видимости необходимо объявить private.

•   Область видимости protected (защищенная). Применяется, когда необходимо обеспечить соблюдение архитектуры наследования. Очень часто ключевые сла protected и abstract применяются совместно, т. к. оба предназначены для использования с механизмом наследования. Основной целью применения оасти видимости protected является предоставление производному классу доупа к частному состоянию родительского класса или предоставление функциальности многократного использования, пользоваться которой могут только опытные разработчики.

•   Область видимости public (общая). Подумайте хорошенько, прежде  чем  пренять эту область видимости. Данная область видимости является наиболее используемой, но в то же самое время может быть причиной большинства прлем. Например, после объявления какого-либо элемента public последующая попытка изменить область видимости может привести  в  полный  беспорядок код, использующий данный элемент. Применение других областей видимости может  несколько  затруднить  процесс  разработки,  но  позволит получить  более

надежный код с  точки зрения поддержки. В конечном счете, решение, какую область   видимости   применить,   принимается   на  основе  того,   какие   методы и свойства необходимо предоставить внешнему коду.

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии