ВУЗ:
Составители:
Рубрика:
49
для чтения. Поэтому оператор присваивания, применяемый к ссылкам и
выполняющий копирование адресов , не порождает здесь обычных для
указателей проблем . Точно так же оператор сравнения на равенство для
классовых ссылок дает вполне корректный результат, ведь таблица вир-
туальных методов класса всегда единственна и потому две ссылки адре-
суют один и тот же класс тогда и только тогда, когда они содержат од и -
наковые указатели.
Имя любого класса может рассматриваться как константа соот -
ветствующего ссылочного типа. В частности, присваивание классовой
ссылке адреса конкретного класса выполняется инструкцией
ИмяСсылкиНаКласс:=ИмяКласса
(операция @ взятия адреса не используется).
Полиморфизм при вызове метода с помощью классовой ссылки
обеспечивается расширенными правилами совместим ости в отношении
операции присваивания: ссылке на класс может быть присвоен адрес
любого класса, производного от того, на который она формально ссыла-
ется. Например, ссылке cn на класс Number, объявленной следующим
образом :
type ClassNumber = class of Number;
var cn: ClassNumber;
с помощью инструкции
cn = Rational;
может быть присвоен адрес таблицы виртуальных методов класса Ra-
tional. После этого вызов с помощью данной ссылки виртуального кон -
структора Create:
cn.Create;
приведет к созданию объекта клас са Rational, а не Number. Если бы кон-
структор Create не был объявлен виртуальным, использовался бы тип из
формального объявления ссылки, т. е. Number.
Мы видим , таким образом , что для решения сформулированной
выше проблемы достаточно в каждом объ екте-векторе с самого созда-
ния хранить ссылку на класс, которому должны принадлежать его ком -
п оненты.
Сформулируем теперь более точно очередную задачу.
д л я чт ения. Поэтом у операт ор прис в аив ания, прим еняем ы й к с с ы л кам и
в ы пол няющ ий копиров ание ад рес ов , не порожд ает з д ес ь обы чны х д л я
указ ат ел ей пробл ем . Точнот ак же оператор с рав нения на рав енс т в од л я
кл ас с ов ы х с с ы л ок д ает в пол не коррект ны й рез ул ьт ат, в ед ь т абл иц а в ир-
т уал ь ны х м етод ов кл ас с а в с егд а ед инс т в енна и потом у д в е с с ы л ки ад ре-
с уют од ин и тот же кл ас с тогд а и тол ь котогд а, когд а они с од ержат од и-
наков ы е указ ат ел и.
И м я л юбого кл ас с а м ожет рас с м ат рив ат ь с я как конс т ант а с оот -
в ет с т в ующ его с с ы л очного т ипа. В час т нос т и, прис в аив ание кл ас с ов ой
с с ы л ке ад рес а конкрет ногокл ас с а в ы пол няет с я инс т рукц ией
ИмяСсылкиНаКласс:=ИмяКласса
(операц ия @ в з ят ия ад рес а не ис пол ь з ует с я).
Пол им орфиз м при в ы з ов е м етод а с пом ощ ь ю кл ас с ов ой с с ы л ки
обес печив ает с я рас ширенны м и прав ил ам и с ов м ес т им ос т и в от ношении
операц ии прис в аив ания: с с ы л ке на кл ас с м ожет бы т ь прис в оен ад рес
л юбогокл ас с а, произ в од ногоот того, на которы й она форм ал ь нос с ы л а-
ет с я. Н априм ер, с с ы л ке cn на кл ас с Number, объяв л енной с л ед ующ им
образ ом :
type ClassNumber = class of Number;
var cn: ClassNumber;
с пом ощ ь ю инс т рукц ии
cn = Rational;
м ожет бы т ь прис в оен ад рес т абл иц ы в ирт уал ь ны х м етод ов кл ас с а Ra-
tional. Пос л е этогов ы з ов с пом ощ ь ю д анной с с ы л ки в ирт уал ь ногокон-
с т руктора Create:
cn.Create;
прив ед ет к с оз д анию объект а кл ас с а Rational, а не Number. Е с л и бы кон-
с т руктор Create не бы л объяв л ен в ирт уал ь ны м , ис пол ь з ов ал с я бы т ип из
форм ал ь ногообъяв л ения с с ы л ки, т. е. Number.
М ы в ид им , т аким образ ом , чт од л я решения с форм ул иров анной
в ы ше пробл ем ы д ос т ат очнов кажд ом объект е-в ект оре с с ам огос оз д а-
ния хранит ь с с ы л ку на кл ас с , котором у д ол жны принад л ежат ь егоком -
понент ы .
С форм ул ируем т еперь бол ее точноочеред ную з ад ачу.
49
Страницы
- « первая
- ‹ предыдущая
- …
- 47
- 48
- 49
- 50
- 51
- …
- следующая ›
- последняя »
