Мир программирования

 


Найти: на:


Меню
Партнеры
Счетчики
Реклама

Совместимость типов объектов


 Предыдущая страница     |     Следующая страница  
Добавить в избанное Обсудить в форуме Написать автору сайта

          Наследование отчасти изменяет правила  совместимости  типов  в Turbo Pascal.  В    добавление  ко  всему прочему,  порожденный тип наследует совместимость   типов  со  всеми  типами   предка.    Эта расширенная совместимость типов имеет три формы :

     - между экземплярами объектов

     - между указателями на экземпляры объектов

     - между формальными и фактическими параметрами

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

     Рассмотрим следующие объявления:

     type

        LocationPtr = ^Location;

        PointPtr    = ^Point;

        CirclePtr   = ^Circle;

     var

        Alocation : Location;

        APoint    : Point;

        ACircle   : Circle;

        PLocation : LocationPtr;

        PPoint    : PointPtr;

        PCircle   : CirclePtr;

      При наличии этих объявлений  следующие  присваивания  являются законными:

     Alocation := APoint;

     APoint    := ACircle;

     Alocation := ACircle;

     Обратные присваивания незаконны.

      Примечание: Родительскому  объекту можно присваивать экземпляр любого порожденного им типа.

     Это понятие новое для Паскаля и,   возможно,   вначале  трудно запомнить какой путь используется для совместимости типов.  Думайте об этом таким образом :  Источник должен полностью заполнять объект назначения. Порожденные      типы   содержат   все,   что  содержат родительские типы     посредством   наследования.    Следовательно, порожденный тип   или имеет такой же размер,  или (обычно)  размер, больший, чем его предок, но никогда не меньший размер. Присваивание родительского объекта порожденному объекту может оставить некоторые поля порожденного объекта неопределенными после этого присваивания, что опасно и,  следовательно, незаконно.

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

      Alocation := ACircle;

только поля  X и Y ACircle будут копироваться в Alocation,  так как только X и Y - это общие типы, которые имеют Circle и Location.

     Совместимость типов так же действует между указателями на типы объектов по   тем  же  общим правилам,  как и для экземпляров типов объектов. Указатели  на потомков можно  присваивать  указателям  на родителей. Эти присваивания указателей являются законными:

      PPoint    := PCircle;

     PLocation := PPoint;

     PLocation := PCircle;

      Запомните, что обратные присваивания являются незаконными.

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

      procedure DragIt (Target : Point);

тогда фактические параметры могут иметь тип Point или Circle, но не тип Location.    Target  может  так  же  быть  параметром типа var; применяются одни и те же правила совместимости типов.

      Примечание: Однако запомните,  что есть коренное отличие между параметром типа значение и var.  Var параметр -  это  указатель  на фактический объект,  передаваемый в качестве параметра,  в то время как параметр типа  значение  является  только  копией  фактического параметра. Более  того,  эта  копия  включает только поля и методы, включенные в тип,  являющийся формальным значением  параметра.  Это означает,  что  фактический  параметр буквально преобразуется в тип формального параметра.  Параметр типа var более подобен  приведению типов,   при   этом   фактический   параметр  остается  неизменным.

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

      procedure figure.Add (NewFigure : Pointer);

тогда фактические параметры должны иметь тип Pointer или CirclePtr, но не могут быть типа LocationPtr.

[оглавление]


Предыдущая страница     |     Следующая страница


Добавить в избанное Обсудить в форуме Написать автору сайта

Опрос

Конкурсы
Реклама

 

Web дизайн: Бурлаков Михаил    

Web программирование: Бурлаков Михаил

Используются технологии uCoz