Студопедия — Полиморфизм
Студопедия Главная Случайная страница Обратная связь

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

Полиморфизм






Объект-потомок может не только дополнять поля и методы родителя, но и заменять методы родителя на новые (заменять поля родителя нельзя!). Например, вместо правила SETLINEVISIBLE мы могли бы в объекте TLINE объявить правило SETVISIBLE, которое в этом случае перекроет (заменит собой) одноименное правило объекта-родителя TPOINT. В результате, к разным родственным объектам TPOINT и TUNE можно было бы применять одноименные правила SETVISIBLE, обеспечивающие сходные в смысловом отношении действия - показать или сделать невидимым графический объект. Свойства, позволяющее называть разные алгоритмические действия одним именем, называется полиморфизмом.

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

Появление директивы VIRTUAL в объявлении метода как бы предупреждает компилятор: "Пока ты не знаешь, что я хочу. Придет время -запроси образец!". Встретившись с таким объявлением, компилятор не будет устанавливать связь объекта с методом. Вместо этого он создаст специальную таблицу, которая называется таблицей виртуальных методов (ТВМ). В этой таблице хранятся адреса точек входа всех виртуальных методов. Для каждого типа объекта создается своя ТВМ и каждый экземпляр объекта пользуется этой единственной для объектов данного типа таблицей. ТВМ обеспечивает работающую программу механизмом связывания объекта с полями. Фактическое связывание осуществляется с помощью обращения к конструктору - специальному методу, который во всем подобен обычной процедуре, но в заголовке вместо PROCEDURE содержит зарезервированное слово CONSTRUCTOR. В момент обращения к конструктору в специальное поле объекта заносится адрес нужной ТВМ, в результате чего все виртуальные методы (в том числе и унаследованные от родителей!) получают доступ к нужным полям.

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

Выбор того, каким именно - статическим или виртуальным - должен быть метод, зависит от специфики задачи и Ваших вкусов. Однако следует помнить, что статический метод никогда не может быть перекрыт виртуальным и наоборот. Список формальных параметров статического метода может отличаться от списка в перекрываемом методе, а для виртуальных методов оба списка должны быть идентичны. И, наконец, виртуальные объекты занимают несколько большую память (за счет ТВМ) и вызов виртуальных методов исполняется чуть медленнее, чем вызов статических. Тем не менее, всегда, когда это возможно, следует отдавать предпочтение виртуальным методам, т.к. они придают программе дополнительную гибкость. Всегда может оказаться, что рано или поздно мы или кто-то из пользователей нашей библиотеки захочет модифицировать ту или иную ее функции. В этом случае перекрытие виртуальных методов позволит предельно упростить задачу. Отметим, что стандартная функция Турбо Паскаля TypeOf(TObj) возвращает ссылку на ТВМ для объекта типа TObj. Эту ссылку можно использовать, например, для проверки того, с каким именно объектом работает в данный момент виртуальный метод:

If TypeOf(Self) - TypeOf(TA) then...

И еще одно замечание. Между экземплярами родственных объектов возможен обмен информацией с помощью операторов присваивания. Например, если PoinTl и Point2 - экземпляры объекта TPOINT, то допустимо присваивание

Point1:= Point2;

или

PoinT2:= Point1;

Присваивания разрешены и между экземплярами родственных объектов разных уровней иерархии, однако в этом случае экземпляру объекта-родителя можно присвоить экземпляр потомка, но не наоборот! Например, разрешается присваивание

Point:= Line;

но недопустимо

Line:= Point;

если LINE - потомок POINT. Это происходит по той причине, что потомок содержит все поля родителя, поэтому при присваивании потомка родителю эти поля получат правильные значения. Обратное же присваивание оставит без изменения "лишние" поля потомка, что является недопустимым.

При использовании виртуальных правил следует остерегаться присваивания между экземплярами объектов, во всяком случае, необходимо помнить, что простое присваивание не заменяет собой инициацию виртуального объекта. Если, например, LINE и POINT - виртуальные объекты, то присваивание

POINT:= Line;

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

 







Дата добавления: 2015-08-12; просмотров: 474. Нарушение авторских прав; Мы поможем в написании вашей работы!



Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...

Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...

Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...

Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

БИОХИМИЯ ТКАНЕЙ ЗУБА В составе зуба выделяют минерализованные и неминерализованные ткани...

Типология суицида. Феномен суицида (самоубийство или попытка самоубийства) чаще всего связывается с представлением о психологическом кризисе личности...

ОСНОВНЫЕ ТИПЫ МОЗГА ПОЗВОНОЧНЫХ Ихтиопсидный тип мозга характерен для низших позвоночных - рыб и амфибий...

Весы настольные циферблатные Весы настольные циферблатные РН-10Ц13 (рис.3.1) выпускаются с наибольшими пределами взвешивания 2...

Хронометражно-табличная методика определения суточного расхода энергии студента Цель: познакомиться с хронометражно-табличным методом опреде­ления суточного расхода энергии...

ОЧАГОВЫЕ ТЕНИ В ЛЕГКОМ Очаговыми легочными инфильтратами проявляют себя различные по этиологии заболевания, в основе которых лежит бронхо-нодулярный процесс, который при рентгенологическом исследовании дает очагового характера тень, размерами не более 1 см в диаметре...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия