Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP_otvety_k_ekzamenu.doc
Скачиваний:
55
Добавлен:
13.04.2015
Размер:
786.94 Кб
Скачать

Статический полиморфизм

Обобщенные концепции в целом напоминают абстрактные классы - интерфейсы. От фактического типа, при помощи которого допускается инстанцировать алгоритм, требуется наличие конкретного набора определенных операций (в случае итератора для алгоритма поиска этот набор включает присвоение, сравнение, постфиксный инкремент, разыменование с целью чтения). Однако, в отличие от интерфейсов, обобщенные концепции в явном виде никаким образом в коде не задаются (идеи явного выражения требований к обобщенной концепции рассматривались при принятии стандарта C++11, однако в итоге не стали частью языка из-за разногласий экспертов). Код шаблонов просто использует необходимые для реализации операции, и предполагает, что конкретный тип их предоставит. Если это не соответствует действительности в момент инстанцирования, компилятор не позволит инстанцировать шаблон с таким типом аргумента.

Обобщенные концепции иногда называют инструментом СТАТИЧЕСКОГО ПОЛИМОРФИЗМА, В отличие от обычного, или динамического полиморфизма, реализуемого на основе механизма виртуальных функций, такая форма полиморфизма имеет ряд преимуществ и недостатков. К плюсам относится следующее:

· нет необходимости в явном написании ограничивающих базовых классов или интерфейсов, возможность дополнять интерфейс чем угодно;

· отсутствуют накладные расходы на вызов во время выполнения, в отличие от виртуальных функций, работающих через косвенные вызовы через указатель vptr;

· возможность частичной реализации общего интерфейса, если остальные случаи не используются (и соответственно, не подлежат инстанцированию и проверкам).

К минусам, по сравнению с динамическим полиморфизмом, можно отнести такие свойства:

· нельзя привести указатели и ссылки к какому-либо базовому классу, а значит нельзя создать массив/контейнер указателей на объекты базового класса;

· компиляция шаблонов приведет к большему объему генерируемого машинного кода и увеличению времени компиляции.

Ниже приведен пример системы объектов, реализованных сначала с использованием динамического полиморфизма на основе абстрактного класса и виртуальных функций, а затем аналогичный пример с использованием статического полиморфизма на основе шаблонов.

В примере речь идет о двух различных системах оценивания студентов - классической 5-бальной советской системы и используемой в высших учебных заведения в настоящее время Болонской 100-бальной системы. К центральной абстракции - таблице оценок студентов (класс AcademicGroupMarks) - подключается конкретный объект, отвечающий за выбранную систему оценивания. Задача системы оценивания состоит в определении организационного вывода в зависимости от набранного балла - неудача, сдача без стипендии, сдача со стипендией.

Начнем с динамического варианта. Потребуется создать интерфейс MarkSystem и описать необходимые для взаимодействия виртуальные функции. Затем этот интерфейс нужно реализовать в двух классах - SovietMarkSystem и BolognaMarkSystem. Конкретный объект системы оценивания создается динамически и прикрепляется к объекту AcademicGroupMarks, образуя отношение композиции с ответственностью за уничтожение. Взаимодействие с дочерним объектом происходит через механизм виртуальных функций.

Аналогичной функциональности можно добиться применяя статический полиформизм. Среди основных отличий реализации от динамической версии следующее:

  • отсутствует необходимость в интерфейсе MarkSystem, поскольку обобщенные концепции в явном виде не описываются;

  • методы классов BolognaMarkSystem и SovietMarkSystem более не виртуальные, а статические;

  • связь между таблицей оценок и системой оценивания реализуется без создания объектов на основе аргумента шаблона;

  • таблица оценок более не нуждается в конструкторе.

Поскольку набор фактических аргументов шаблона конечен и заранее известен, применяется модель явного инстанцирования шаблона.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]