Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Ключевое слово is

Инкапсуляция с использованием свойств .NET | Свойства, доступные только для чтения и только для записи | Статические свойства | Статические конструкторы | SetFullName (fullName); | Ключевое слово sealed | Ключевые слова virtual и override | Абстрактные классы | Полиморфный интерфейс | Сокрытие методов |


Читайте также:
  1. I. Вступительное слово классного руководителя.
  2. II. Вступительное слово учителя.
  3. II. Если слово не из списка для запоминания и не исключение, то определяю,
  4. II. Иисус - воплотившееся слово Бога-Творца.
  5. II. Работа над смысловой и интонационной законченностью предположения.
  6. III. Перепишите и переведите письменно предложения и словосочетания, обратите внимание
  7. III. Работа над построением словосочетаний и предложений.

Учитывая, что метод GivePromotion() был спроектирован для приема любого возможного типа, производного от Employee, может возникнуть вопрос — как этот метод может определить, какой именно производный тип был ему передан? И, кстати, если входной параметр имеет тип Employee, как получить доступ к специализированным членам типов SalesPerson и Manager?

В дополнение к ключевому слову as, в С# предлагается ключевое слово is, которое позволяет определить совместимость двух типов. В отличие от ключевого слова as, если типы не совместимы, ключевое слово is возвращает false, а не null- ссылку. Рассмотрим следующую реализацию метода GivePromotion():

(этот код вставляем в проект EmployeeExample, класс Program)

Задание!!!: протестировать, исправить возможные ошибки

Здесь во время выполнения производится проверка, на что именно в памяти указывает ссылка типа базового класса. Определив, что принят SalesPerson или Manager, можно применить явное приведение и получить доступ к специализированным членам класса. Также обратите внимание, что окружать операции приведения конструкцией try/catch не обязательно! поскольку внутри контекста if, выполнившего проверку условия, уже известно, что приведение безопасно.

 

8 Применение модели включения – делегирования.

В мире ООП помимо наследования существует еще одна форма повторного использования кода. Эта форма называется включением-делегированием (или отношением «иметь» - has a). При ее использовании один класс включает в свой состав другой и открывает внешнему миру часть возможностей этого внутреннего класса.

Например если мы создаем программную модель автомобиля, то может понадобиться включить внутрь объекта «автомобиль» объект «радио» с помощью отношения «иметь». Это вполне разумный подход, поскольку вряд ли возможно произвести как радио от авто, так и авто от радио, используя отношение наследования. Вместо наследования мы создаем два независимых класса, работающих совместно, где внешний (контейнерный) класс создает внутренний класс и открывает внешнему миру его возможности.

При этом внешний объект Car (автомобиль) ответственен за создание внутреннего объекта Radio (радио). Если мы хотим, чтобы через объект Car можно было бы обращаться ко внутреннему объекту Radio, то для этого в классе Car необходимо предусмотреть специальный открытый интерфейс для этой цели. При этом клиент класса Car и не узнает, что тот передает обращения какому-то внутреннему объекту.

Пример 3.

Программная модель автомобиля.

Для начала создадим новое консольное приложение С# по имени CarExample.

 

(этот код вставляем в проект CarExample, namespace Car)

Задание!!!: протестировать, исправить возможные ошибки

В классе Car (показанном ниже), сделаем так, чтобы в случае превышения объектом Саг предопределенной максимальной скорости (отражаемой с помощью константы экземпляра MaxSpeed) двигатель выходил из строя, приводя его в нерабочее состояние (отражаемое приватной переменной экземпляра bool по имени dead). Кроме того, включим в Саг свойства для представления текущей скорости и указанного пользователем "дружественного названия" автомобиля и различные конструкторы для установки состояния нового объекта Саг.

(этот код вставляем в проект CarExample, namespace Car)

 

Задание!!!: протестировать, исправить возможные ошибки

Сейчас в нашем распоряжении есть два независимых класса – Radio и Car. Понятно, что эти два класса должны взаимодействовать друг с другом и эти отношения надо зафиксировать некоторым образом. Зафиксируем эти отношения с помощью включения-делегирования: пусть машина включает в себя радио и передает этому классу необходимые команды. Помещение приемника внутрь авто влечет за собой внесение в определение класса Car следующих изменений:

(этот код вставляем в проект CarExample, класс Car)

Задание!!!: протестировать, исправить возможные ошибки

После этого нам надо определить, как внешний мир будет взаимодействовать с внутренним классом? Понятно, что ответственность за создание объекта внутреннего класса несет внутренний контейнерный класс. Код для создания объектов внутреннего класса можно помещать куда угодно, но обычно он помещается среди конструкторов контейнерного класса.

(этот код вставляем в проект CarExample, в конструкторы класса Car)

Задание!!!: протестировать, исправить возможные ошибки

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

Например, в класс Car добавляем такой метод:

(этот код вставляем в проект CarExample, в класс Car)

Задание!!!: протестировать, исправить возможные ошибки


Выводим автомобиль на пробную поездку:

(этот код вставляем в проект CarExample, в класс Program)

Задание!!!: протестировать, исправить возможные ошибки


Дата добавления: 2015-07-25; просмотров: 61 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Правила приведения к базовому и производному классу| Определение вложенных типов

mybiblioteka.su - 2015-2024 год. (0.008 сек.)