ВУЗ:
Составители:
Рубрика:
43
число в виде p-ичной дроби нельзя. Таким образом , нам снова не оста-
ется ничего лучшего, как возбудить исключение.
Заметим , что поведение функций Plus и Dot в случае, когда их ар-
гумент не принадлежит классу PAryFraction, в действительности полно-
стью определяется реализацией аналогичных методов класса Rational. В
самом деле, операции сложения и умножения в поле Q коммутативны , по-
этому результат их применения к паре объектов , один их которых являе т -
ся p-ичной дробью, а другой — нет, не должен зависеть от порядка аргу-
ментов . Но если на первом месте стоит обычное рациональное чи с ло, то
для выполнения вычислений используется версия метода из класса Ra-
tional, для которой тип второго аргумента уже не имеет никакого значения.
Итак, основ ной вопрос , остающийся открытым: как определить
реал ьный тип объекта во время выполнения программы? В Object Pascal
для этого используется оператор is. Выражение
ИмяОбъекта is ИмяКласса
возвращает «истину» , если объект принадлежит данному классу или од-
ному из его потомков и «ложь» в противном случае.
Для использования оператора is необходимо, чтобы объект и
класс были сравнимы, т. е. формальный тип объектной переменной , ука-
занный при ее объявлении, являлся либо предком , либо потомком клас-
са, с которым производится сравнение. Иное не допустит компил ятор .
После определения класса объекта необходимо выполнить соот -
вет с т вующее приведение типа. Сделать это можно как посредством
обычной инс трукции
ИмяКласса(ИмяОбъекта)
так и при помощи специального оператора as. Последний отличается
тем , что помимо собственно приведения типа осуществляет проверку
коррект ности этой операции.
Выражение
ИмяОбъекта as ИмяКласса
позволяет использовать объектную переменную как ссылку на объект
указанного класса (как и выше, здесь необходима сравнимость объекта и
класса). Е с ли при этом тип реального объекта не совпадает с данным
классом или его потомком (т. е. выражение ИмяОбъекта is ИмяКласса
ложно), возникает соот вет с т вующее исключение.
Таким образом , оператор as выполняет безопасное приведение
типа, гарантируя предсказуемое поведение программы при любом соч е -
тании действительного и требуемого классов объекта. Тем не менее,
чис л ов в ид е p-ичной д роби нел ь з я. Т аким образ ом , нам с нов а не ос т а-
ет с я ничегол учш его, как в оз буд ит ь ис кл ючение.
Зам ет им , чтопов ед ение функций Plus и Dot в с л учае, когд а ихар-
гум ент не принад л ежит кл ас с у PAryFraction, в д ейс т в ит ел ь нос т и пол но-
с т ь ю опред ел яет с я реал из ацией анал огичны хм етод ов кл ас с а Rational. В
с ам ом д ел е, операции с л ожения и ум ножения в пол е Q ком м ут ат ив ны , по-
этом у рез ул ьт ат ихприм енения к паре объектов , од ин ихкоторы хяв л яет -
с я p-ичной д робь ю, а д ругой — нет, не д ол жен з ав ис ет ь от поряд ка аргу-
м ентов . Н оес л и на перв ом м ес т е с тоит обы чное рационал ь ное чис л о, то
д л я в ы пол нения в ы чис л ений ис пол ь з ует с я в ерс ия м етод а из кл ас с а Ra-
tional, д л я которой т ип второгоаргум ент а уже не им еет никакогоз начения.
И т ак, ос нов ной в опрос , ос т ающийс я от кры т ы м : как опред ел ит ь
реал ь ны й т ип объект а в ов рем я в ы пол нения програм м ы ? В Object Pascal
д л я э тогоис пол ь з ует с я оператор is. Вы ражение
ИмяОбъекта is ИмяКласса
в оз в ращает «ис т ину» , ес л и объект принад л ежит д анном у кл ас с у ил и од -
ном у из егопотом ков и «л ожь » в прот ив ном с л учае.
Дл я ис пол ь з ов ания операт ора is необход им о, чтобы объект и
кл ас с бы л и с рав ним ы , т. е. форм ал ь ны й т ип объект ной перем енной, ука-
з анны й при ее объяв л ении, яв л ял с я л ибопред ком , л ибопотом ком кл ас -
с а, с которы м произ в од ит с я с рав нение. И ное не д опус т ит ком пил ятор.
Пос л е опред ел ения кл ас с а объект а необход им о в ы пол нит ь с оот -
в ет с т в ующее прив ед ение т ипа. Сд ел ат ь э то м ожно как пос ред с т в ом
обы чной инс т рукции
ИмяКласса(ИмяОбъекта)
т ак и при пом ощи с пециал ь ного оператора as. Пос л ед ний отл ичает с я
т ем , что пом им о с обс т в енно прив ед ения т ипа ос ущес т в л яет пров ерку
коррект нос т и э той операции.
Вы ражение
ИмяОбъекта as ИмяКласса
поз в ол яет ис пол ь з ов ат ь объект ную перем енную как с с ы л ку на объект
указ анногокл ас с а (как и в ы ш е, з д ес ь необход им а с рав ним ос т ь объект а и
кл ас с а). Е с л и при э том т ип реал ь ного объект а не с ов пад ает с д анны м
кл ас с ом ил и его потом ком (т. е. в ы ражение И м я О бъект а is И м я Клас с а
л ожно), в оз никает с оот в ет с т в ующее ис кл ючение.
Т аким образ ом , оператор as в ы пол няет без опас ное прив ед ение
т ипа, гарант ируя пред с каз уем ое пов ед ение програм м ы при л юбом с оче-
т ании д ейс т в ит ел ь ного и т ребуем ого кл ас с ов объект а. Т ем не м енее,
43
Страницы
- « первая
- ‹ предыдущая
- …
- 41
- 42
- 43
- 44
- 45
- …
- следующая ›
- последняя »
