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

Конец описания.

Читайте также:
  1. Quot;Наконец, братия (мои), что только истинно, что честно, что справедливо, что чисто, что любезно, что достославно, что только добродетель и похвала, о том помышляйте".
  2. БОЛЬШАЯ АМБИЦИЯ И ЖАЛКИЙ КОНЕЦ
  3. Буратино наконец возвращается домой вместе с папой Карло, Мальвиной, Пьеро и Артемоном
  4. В. Г. Гаршин. Конец 1930-х гг.
  5. Ведущий:И, наконец, всю полноту ответственности за вас все одиннадцать лет несла директор гимназии Карташова Ольга Сергеевна
  6. Возникновение политических партий конец XIX – начало XX вв.: их программы, тактики, ли­деры.
  7. Генка в три прыжка оказался в соседней комнате. Там тоже валялись трупы — два или три. Но, наконец, он увидел живую.

Примечание. При реализации методов «Изобразить» и «Инициализировать» потомка можно вызвать соответствующие родительские методы, а затем добавить операторы, определяющие собственные действия метода для разрабатываемого класса.

Сложный полиморфизм или создание полиморфных объектов.

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

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

· при работе с указателями, когда указателю на объект класса-родителя присваивается адрес объекта класса-потомка.

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

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

С помощью механизма позднего связывания реализуется оперативная перестройка программы в соответствии с типами используемых объектов.

Пример

Сложный полиморфизм. Пусть родительский класс содержит два метода «Out» и «Print», один из которых вызывает другой. Класс-потомок наследует метод «Out», но имеет собственный метод «Print». Метод «Out» наследуется и может быть вызван как для объекта класса-родителя, так и для объекта класса-потомка (рис.).

При вызове метода «Out» для объекта класса-потомка необходимо обеспечить, чтобы этот метод вызывал метод Print потомка, а не родителя (рис.).

Определить, для объекта какого класса: родителя или потомка вызывается метод «Out», можно только на этапе выполнения. Следовательно, для метода «Print» необходимо обеспечить позднее связывание.

 

 

Если определение адреса метода «Print» происходило бы на этапе компиляции программы, то и для объекта родительского класса, и для объекта класса-потомка из метода «Out» вызывался бы метод «Print» класса-родителя. Описание метода «Print» как метода, для которого запрещается определение адреса на этапе компиляции, приведет к тому, что адрес метода «Print» будет определяться в процессе выполнения программы. В этот момент уже будет известно, объект какого класса вызывает метод «Out», и будет вызываться метод «Print» именно этого класса.

Методы, для которых должно реализовываться позднее связывание, получили название виртуальных. Для их описания в рассматриваемых далее языках программирования используется служебное слово «virtual».

Следует отметить, что методы, работающие с полиморфными объектами – это всегда методы классов-родителей, описывающие общие моменты поведения объектов. В сложной иерархии, таким образом, можно выделить семейство классов со схожим поведением объектов. Они образуют поддерево, в корне которого находится класс, определяющий общие моменты поведения.

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

При использовании полиморфных объектов возникают проблемы с доступом к полям объекта, описанным в классе-потомке: указатель на объект класса-родителя связан с описанием полей класса-родителя, и поля, описанные в классе-потомке, для него «невидимы» (рис.).

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

 


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


Читайте в этой же книге: Объектная декомпозиция | Объекты и сообщения | Т: Классы | Конец описания. | Наполнение при разработке классов | Делегирование методов | Контейнерные классы | Цикл-пока <очередной элемент> определен | Исключения при разработке классов |
<== предыдущая страница | следующая страница ==>
Простой полиморфизм| Композиция при разработке классов

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