11. ПРИВЕДЕНИЕ ТИПОВ
На операции с переменной определенного типа компилятор обычно налагает ограничения, разрешая выполнение только тех операций, которые характерны для указанного типа данных. Иногда компилятор осуществляет автоматическое приведение типа, например, при присвоении целого значения действительной переменной.
В языке Pascal имеется механизм явного приведения типов.
В операции is определяется, принадлежит ли данный объект указанному типу или одному из его потомков.
Выражение, представленное в следующем примере, возвращает True,если переменная AnObject ссылается на образец объектного типа TMyClass или одного из его потомков.
AnObject isTmyClass
Сама по себе операция is не является операцией задания типа. В ней лишь проверяется совместимость объектных типов. Для корректного приведения типа объекта применяется операция as:
WithAnObject asTmyClass do…
Возможен и такой способ приведения типа без явного указания as.
WithTMyClass(AnObject) do…
В программах перед операцией asпроверяют совместимость типов с помощью операции is. Если типы несовместимы, запускается обработчик исключительной ситуации EinvalidCast.
Таким образом, в конструкции as операция явного приведения типа оказывается заключенной в безопасную оболочку:
IfAnObject isTobjectType then
withTobjectType(AnObject) do…
else
raiseEinvalidCast.Create('Неправильное приведение типа');
12. ОБЪЕКТНАЯ ССЫЛКА
Delphiпозволяет создать специальный описатель объектного типа (именно на тип, а не на экземпляр!), известный как object reference — объектная ссылка.
Объектные ссылки используются в следующих случаях:
— тип создаваемого объекта не известен на этапе компиляции;
— необходим вызов метода класса, чей тип не известен на этапе компиляции;
— в качестве правого операнда в операциях проверки и приведения типов с использованием is и as.
Объектная ссылка определяется с использованием конструкции class of… Приведем пример объявления и использования class reference:
type
TMyObject = class(TObject)
MyField: TMyObject;
constructorCreate;
end;
TObjectRef = class ofTObject;
…
var
ObjectRef: TObjectRef;
s: string;
begin
ObjectRef:=TMyObject; {присваиваем тип, а не экземпляр!}
s:=ObjectRef.ClassName; {строка s содержит 'TMyObject'}
end;
Таким образом, в Delphi определена специальная ссылка TClass, совместимая по присваиванию с любым наследником TObject. Аналогично объявлены классы: TPersistentClass и ТСотроnentClass.
13. СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
Под исключительной ситуацией (raise) здесь понимается ситуация, которая не позволяет без особых дополнительных мер продолжить выполнение программы, например деления на ноль, переполнения разрядной сетки, извлечения квадратного корня из отрицательного числа и т. д.
При традиционной обработке ошибок, ошибки, обнаруженные в процедуре, обычно передаются наружу (в вызывавшую процедуру) в виде возвращаемого значения функции, параметров или глобальных переменных (флагов). Каждая вызывающая процедура должна проверять результат вызова на наличие ошибки и выполнять соответствующие действия. Часто это просто выход в более верхнюю вызывающую процедуру и т. д.
Структурная обработка исключительных ситуаций — это программный механизм, позволяющий программисту при возникновении ошибки (исключительной ситуации — exception) связаться с кодом программы, подготовленным для обработки такой ошибки. В Delphi система называется структурной, поскольку обработка ошибок определяется областью "защищенного" кода. Такие области могут быть вложенными. Выполнение программы не может перейти на произвольный участок кода. Выполнение программы может перейти только на обработчик исключительной ситуации активной программы.
Модель исключительных ситуаций в Object Pascal является не-возобновляемой (non-resumable). При возникновении исключительной ситуации вы уже не сможете вернуться в точку, где она возникла, для продолжения выполнения программы (это позволяет сделать лишь возобновляемая (resumable) модель).
Для обработки исключительных ситуаций в язык Object Pascal добавлено новое ключевое слово "try", которое используется для обозначения первой части защищенного участка кода. Существуют два типа защищенных участков:
Читать дальше