Когда читаешь о той или иной реализации механизмов ООП, довольно забавно видеть, как ту или иную особенность конкретного языка или библиотеки называют «очевидной».
Особо примечательно в этом плане описание ООП в C++, реализация которого, по сути, одна из самых непрозрачных и запутанных.
Итак, я не буду ничего писать об очевидности, а расскажу о том, как облегчить себе жизнь в критические моменты жизненного цикла объектов, используя не «очевидные», но очень полезные особенности реализации ООП в Дельфи.
Обработка сбоя при завершении создания объекта в конструкторе
Если конструктор хранит свои данные только в полях объекта, то решение элементарное — просто вызвать исключение.RTL Delphi сама его перехватит, вызовет деструктор, освободит занятую память и снова вызовет исключение.
Соответственно, если часть данных для построения хранится в глобальных переменных, то достаточно использовать обычный блок try.кроме с повторным вызовом исключения.
Это приводит к двум требованиям к деструкторам: не генерировать исключения, то есть не пытаться делать что-либо кроме освобождения ресурсов (например, сохранения настроек) и обязательно поддерживать.
Удаление частично инициализированного объекта
В Delphi это не представляет никаких сложностей, поскольку любой объект инициализируется нулем еще до передачи управления конструктору.Соответственно, достаточно корректно обрабатывать нулевые значения в деструкторе, чему очень помогает процедура FreeAndNil, которая освобождает объект только в том случае, если ссылка на него уже не равна нулю.
Порядок вызова конструкторов
В Delphi это не имеет значения.
Вы можете вызывать конструкторы-предки, другие конструкторы того же класса так же, как и обычные методы, или ничего не вызывать - так что если вам нужно использовать инициализацию предка, то забывать ее вызывать не рекомендуется, но делать что-то до или вместо вызов конструктора не проблема, предков нет.
Вызов виртуальных методов в конструкторе
Поскольку в Delphi объект сразу инициализируется финальной ссылкой на VMT, разницы между вызовом виртуальных методов из конструктора и другими вариантами нет.Виртуальные конструкторы и ссылки на классы
В Delphi конструкторы могут быть виртуальными.Смысл этой возможности — возможность создавать объекты с неизвестным на этапе компиляции классом без необходимости реализации фабрики.
Для этого используются переменные со ссылкой на класс (а не объект!), для чего можно вызвать виртуальный конструктор, получив экземпляр соответствующего класса или его потомка, в зависимости от значения ссылки.
Автоматический контроль срока жизни объекта
Если объект реализует тот или иной явно определенный интерфейс, то его можно привести к ссылке на этот интерфейс с помощью присваивания или оператора as. В этом случае Delphi сама будет генерировать вызовы методов IUnknown, что позволяет не запрашивать интерфейсы и не удалять объекты явно.
Полученные результаты
С одной стороны, каждый разработчик должен знать все вышеперечисленное; с другой стороны, я встречал немало опытных программистов, которые изобретают велосипед только по незнанию особенностей реализации своего рабочего инструмента.Надеюсь, эта статья немного поможет. Из полезных особенностей реализации ООП в Delphi осталась нерассмотренной поддержка делегирования реализации интерфейса, но это тема для отдельной статьи.
Теги: #delphi #ООП #delphi
-
Api 2Гис. Новые Организации Каждый День-2
19 Oct, 24 -
Управление Ит Без Проблем
19 Oct, 24 -
Новые Киндлы
19 Oct, 24 -
Квантовая Левитация (Эффект Мейснера)
19 Oct, 24 -
Остров Сокровищ
19 Oct, 24 -
Странное Смс Якобы От Билайна.
19 Oct, 24 -
Откуда Взялся Веб 2.0?
19 Oct, 24