Свойства

Свойства (Properties) в Delphi: что это и для кого
Свойства — это ключевой элемент объектно-ориентированного программирования в Delphi, обеспечивающий контролируемый доступ к данным класса. Они сочетают в себе гибкость методов и простоту полей. Данный материал создан для трёх основных групп разработчиков:
- Начинающие программисты — осваивающие синтаксис и логику построения классов. Их цель — понять, как объявлять простые свойства и чем они отличаются от полей.
- Разработчики библиотек и компонентов — стремящиеся к созданию гибких и безопасных API. Они выбирают свойства с геттерами/сеттерами, чтобы контролировать проверку данных и ленивую инициализацию.
- Инженеры высоконагруженных систем — заинтересованные в производительности. Для них важны инлайн-геттеры, директивы
storedиdefaultдля сериализации, а также индексные свойства для работы с массивами.
Синтаксис и виды объявлений
Базовое объявление свойства выглядит так:
property MyProp: Integer read FMyProp write SetMyProp;
Разберём три распространённые комбинации:
- Прямой доступ к полю — для простых данных без логики:
property Name: string read FName write FName;. Подходит для объектов-значений (DTO) и быстрых прототипов. - Геттер/сеттер — для валидации или вычислений:
property Age: Integer read GetAge write SetAge;. Рекомендуется для всех бизнес-логик в серьёзных приложениях. - Свойство только для чтения —
property Count: Integer read GetCount;. Идеально для публичной статистики или внутренних счётчиков.
Спецификаторы stored, default и nodefault
Эти директивы критичны для разработчиков, работающих с потоковой передачей (DFM-файлы, сохранение состояния):
- stored — управляет решением о сохранении значения. Может быть константой
True/Falseили именем метода:stored IsStoredProperty. Позволяет не сохранять значения, совпадающие с умолчаниями. - default — задаёт значение по умолчанию для компонента:
default 10. Если текущее значение совпадает с default, оно не будет записано в DFM (при использовании stored). - nodefault — явно отменяет наследованное значение по умолчанию.
Индексные и массивные свойства
Для тех, кто работает с многомерными данными или коллекциями, Delphi предлагает два мощных типа:
- Свойства с индексами — позволяют организовать массивоподобный доступ через параметр:
property Items[Index: Integer]: string read GetItem write SetItem;. Выбор тех, кто разрабатывает кастомные списки или деревья. - Array-свойства — классический способ эмуляции массивов в классах. Пример:
property Cells[Row, Col: Integer]: Variant read GetCell write SetCell;. Незаменимы для табличных структур.
Модификаторы доступа и видимость
Правильная настройка доступа — основа инкапсуляции. Сравнение для разных аудиторий:
- public и published — для интерфейса класса. Published добавляет информацию для RTTI (требуется для компонентов).
- protected — для наследников. Оптимально при создании библиотек классов, где дочерние модули должны переопределять поведение.
- private и strict private — только для внутренней реализации. Strict private недоступно даже для методов того же модуля (в Delphi 2007+). Выбор для максимального сокрытия данных.
Практические рекомендации по выбору
- Если вы пишете компонент для IDE — используйте
publishedсвойства сstoredиdefault; геттеры делайтеinlineдля скорости. - Если проект требует частой сериализации — избегайте вычисляемых свойств; отдавайте предпочтение простым полям с
read FField write FField. - Для высоконагруженных систем — применяйте свойства с индексами только при работе с динамическими данными; в остальных случаях используйте прямые массивы.
- Начинающим — всегда начинайте с простых свойств без геттеров/сеттеров; усложняйте код постепенно.
Заключение: какой тип свойства выбрать в 2026 году
Выбор свойства в Delphi зависит от контекста. Для подавляющего большинства задач в современных проектах (2026 год) достаточно комбинации read private поле и write private сеттер. Индексные и массивные свойства — прерогатива низкоуровневых библиотек и специфических бизнес-структур. Используйте stored только если вы знаете, что сериализация является узким местом — в остальных случаях его избыточность неоправданна.
Добавлено: 27.04.2026
