Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_ekzamen_po_OOP.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
294 Кб
Скачать
☆

27. Технические приемы, связанные с использованием интерфейсов (делегирование, использование директивы implements)

В Delphi можно делегировать реализацию интерфейса, поддерживаемого некоторым классом, объекту, входящему в состав этого класса. При этом, доступ к объекту осуществляется с использованием свойства, и т.о. можно сделать код реализации интерфейса частью нескольких, практически несвязанных между собой классов. Для реализации такого подхода используется специальная директива implements. TMyJumper = class (IInterfacedObject,IJumper) private fJumpImpl: IJumper; public constructor Create; property Jumper: IJumper read fJumpImpl implements IJumper; end; Видно, что свойство ссылается на переменную интерфейсного типа, однако, на практике можно ссылаться на переменную, ссылающуюся на обычный объект. Использование директивы implements позволяет делегировать реализацию метода интерфейса другим классам. Она всегда указывается последней в определении свойства, после неё можно указать не один, а целый ряд интерфейсов, отделяемых запятыми. Директива implements позволяет осуществить бесконфликтное объединение - концепция COM, относящаяся к комбинации классов для выполнения одной задачи. Ещё одно преимущество данной директивы состоит в том, что она позволяет отложить использование необходимых для реализации интерфейсов ресурсов до того момента, когда они станут действительно необходимы. Например, для реализации некоторого интерфейса требуется 1 мегабайт памяти для хранения растрового изображения, но интерфейс требуется пользователю редко. Неэффективно постоянно выделять метр памяти, который будет использоваться время от времени. Директива implements позволяет реализовать интерфейс в отдельном классе и создавать экземпляр по мере необходимости. TJumperImpl = class(TAggregatedObject, IJumper) private Pos: integer; public function Jump: string; function Walk: String; procedure SetPos (Value: integer); function GetPos: integer; end; Здесь используется TAggregatedObject для того, чтобы не было некорректной работы счётчика ссылок.

28. Исключительные ситуации

В Delphi исключения – это объекты, содержащие информацию, идентифицирующую ошибку и место её возникновения. В библиотеке RTL определен целый ряд исключений, относящихся к проблемам, возникающим в процессе выполнения программ, а так же к проблемам ресурсов Windows. Например, нехватке памяти, или ошибкам компонентов, использование неправильного индекса и т.п. Программист может создавать собственные исключения, производя новый подкласс от стандартного класса-исключения или одного из его потомков. Например. type EArrayFull = class (Exception) В примере при добавлении новых элементов в массив, который уже заполнен, можно породить соответствующую исключительную ситуацию, создав объект данного класса: … if MyArray.Full then raise EArrayFull.Create (‘Массив полон’); … У метода Create, наследуемого от класса Exception, есть строковый параметр, описывающий пользователю исключительную ситуацию. Программисту не надо заботится об уничтожении объекта, созданного для обработки исключения – его удаление производится автоматически механизмом обработки исключений. В программе можно использовать любое количество обработчиков после одного и того же блока try. В этом случае они будут выполняться последовательно один за другим. Поэтому, обработчики более широкого назначения (т.е. обработчики классов, являющихся родителями по отношению к другим классам, необходимо размещать ближе к концу этой последовательности, т.е. т.к. существует иерархия классов исключений, обработчик будет вызван и для подклассов, связанных с ним типов данных).

Обработка исключений. Идея исключений состоит в том, чтобы сделать программу более надёжной, позволяя обрабатывать программные и аппаратные ошибки простым единообразным способом. Программа при этом может сохранить работоспособность или завершить работу корректно, позволяя пользователю сохранить все данные перед выходом. Технология обработки ошибок позволяет отделить код обработки ошибок от смыслового кода, не смешивая их в единое целое. Кроме того, исключения определяют универсальный и стандартный механизм сообщения об ошибках, используемый так же компонентами Delphi.

try помечает начала защищённого участка кода.

except обозначает конец защищённого участка кода и начало операторов обработки исключения. Синтаксис следующий: on ТипИсключения do.

finally специфицирует код, который выполнится в любом случае, даже если произошло исключение. В рамках фрагмента кода, помеченного этим ключевым словом, как правило выполняются разного рода завершающие операции.

raise позволяет породить исключительную ситуацию.

Большинство исключений, с которыми программист сталкивается, в Delphi генерируются системой, но можно самостоятельно породить исключение в программе, когда на этапе выполнения программы вдруг обнаружится некорректность или противоречивость данных. Ключевое слово raise можно так же использовать внутри обработчика исключений, чтобы породить исключения заново. Это может потребоваться для того, чтобы передать исключение следующему обработчику.