СРСП

СРСП № 4

Тема: Полиморфный объект.

Цель: знать понятие полиморфыного объекта

Если  в  качестве  параметра  можно  передавать любой тип из типов, порождаемых типом  параметра,  то  как  тот,  кто  использует  этот параметр,   определяет   какой   тип  объекта  получен.  Фактически пользователь не знает этого явно. Точный тип фактического параметра неизвестен во время компиляции.  Он может быть любым типом объекта, порожденным от типа параметра var и поэтому  называется полиморфным объектом.

     В чем же преимущество полиморфных объектов?  Самое  главное  в том, что    полиморфные  объекты допускают обработку объектов,  тип которых неизвестен во время компиляции.

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

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

     Кроме того,  окружность не имеет сторон,  квадрат  имеет  одну длину стороны,  прямоугольник - две различные длины сторон и т.д. В этом случае искусные программисты на Turbo  Pascal  идут  дальше  и выполняют  вышеописанную задачу следующим образом:  передают запись графической  фигуры  процедуре   DragIt   как   содержимое   общего указателя.   Внутри   DragIt   просматривают   поле   признака  при фиксированном смещении  внутри  записи  графической  фигуры,  чтобы определить  какой  тип  имеет  данная  фигура  и затем осуществляют вставку с помощью предложения case:

      case FigureIdTage of

        Point: DragPoint;

        Circle: DragCircle;

        Square: DragSquare;

        Rectangle: DragRectangle;

        Curve: DragCurve;

      Конечно, включение   семнадцати   небольших  кусков  программы внутрь одного куска является небольшим шагом вперед,  но  при  этом остается нерешенной     следующая   проблема:   что  делать,   если пользователь пакета определит несколько  новых  графических  фигур, например, пользователь     разрабатывает  дорожные  знаки  и  хочет работать с восьмиугольником для знака остановки.   Пакет  не  имеет типа Octagon (восьмиугольник),  поэтому DragIt не имеет метку этого типа в предложении case и,   следовательно,   откажется нарисовать новую восьмиугольную  фигуру.  Если эту запись передать DragIt,  то фигура типа Octagon должна попасть в часть  else  предложения  case как нераспознанная фигура.

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

     Выход состоит в использовании для объектов  правил расширенной совместимости типов Turbo Pascal и проектировании прикладной задачи с использованием полиморфных объектов и виртуальных  методов.  Если процедура  пакета  DragIt написана так,  чтобы она могла работать с полиморфными объектами,  то она будет работать с любыми  объектами, определенными  внутри  пакета  - и с любыми порожденными объектами, которые Вы определили сами.  Если типы объектов  пакета  используют виртуальные методы, то объекты и подпрограммы пакета могут работать с  обычными  графическими  фигурами  в  собственных  терминах  этой фигуры.  Виртуальный  метод,  который  Вы определите сейчас,  может вызываться  файлом  модуля  .TPU  пакета,  который  был  написан  и откомпилирован годом позже. Объектно-ориентированное программирование  делает  это  возможным,  а   виртуальные   методы являются ключом к решению этой проблемы.

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

Контрольные вопросы

1.      Какой тип объекта называется полиморфным?

2.      В чем же преимущество полиморфных объектов? 


Ұқсас жұмыстар

Вуздағы кафедра құжат айналымын DELPHI көмегімен дамытуды ұйымдастыру
Акционерлік қоғамның қаржылық жағдайына жүргізілген талдау
Тіршілік қауіпсіздігі негіздері
Төлем көзінен салық салынбайтын табыстары барлар
Баян Сұлу АҚ мысалында операциялық және қаржылық тұтқа әсеріне талдау жүргізу
Оқу процесін ұйымдастырудың кредиттік жүйесі
Туристік өнімді қалыптастыру
Тұрғын үймен қамту бағдарламалары
Аммиактың алмасуы
Сызықтық регрессия