- •3. Объектно-ориентированное программирование (ооп)
- •3.1. Краеугольные камни ооп
- •3.1.1. Что такое объект?
- •3.1.2. Концептуальный пример объекта
- •3.1.3. Природа объекта
- •3.1.4. Понятие класса объектов
- •3.1.5. Три кита ооп
- •3.1.6. Объекты и компоненты
- •3.2. Классы
- •3.2.1. Понятие класса
- •3.2.2. Классы в программных модулях
- •3.3. Объекты
- •3.4. Методы
- •3.4.1. Понятие метода
- •3.4.2. Конструкторы и деструкторы
- •3.5. Свойства
- •3.5.1. Понятие свойства
- •3.5.2. Методы получения и установки значений свойств
- •3.5.3. Свойства-массивы
- •3.5.4. Свойство-массив как основное свойство объекта
- •3.5.5. Методы, обслуживающие несколько свойств
- •3.6. Наследование
- •3.6.1. Понятие наследования
- •3.6.2. Прародитель всех классов
- •3.6.3. Перекрытие атрибутов в наследниках
- •3.6.4. Совместимость объектов различных классов
- •3.6.5. Контроль и преобразование типов
- •3.7. Статические методы
- •3.7.1. Понятие статического метода
- •3.8. Виртуальные методы
- •3.8.1. Понятие виртуального метода
- •3.8.2. Механизм вызова виртуальных методов
- •3.8.3. Абстрактные виртуальные методы
- •3.8.4. Динамические методы
- •3.8.5. Методы обработки сообщений
- •3.9. Указатели на методы объектов
- •3.12. Метаклассы
- •3.12.1. Ссылки на классы
- •3.12.2. Методы классов
- •3.12.3. Виртуальные конструкторы
- •3.13. Классы общего назначения
- •3.13.1. Классы для представления списка строк
- •Свойства:
- •Методы:
- •События:
- •3.13.2. Классы для представления потока данных
- •Общие свойства:
- •Общие методы:
- •3.14. Итоги
- •4. Исключительные ситуации и надежное программирование
- •4.1. Ошибки и исключительные ситуации
- •4.2. Классы исключительных ситуаций
- •4.3. Обработка исключительных ситуаций
- •4.3.1. Создание исключительной ситуации
- •4.3.2. Распознавание класса исключительной ситуации
- •4.3.3. Пример обработки исключительной ситуации
- •4.3.4. Возобновление исключительной ситуации
- •4.3.5. Доступ к объекту, описывающему исключительную ситуацию
- •4.4. Защита выделенных ресурсов от пропадания
- •4.4.1. Утечка ресурсов и защита от нее
- •4.5. Итоги
3.5. Свойства
3.5.1. Понятие свойства
Помимо полей и методов в объектах существуют свойства.
1. При работе с объектом свойства выглядят как поля: они принимают значения и участвуют в выражениях. Но в отличие от полей свойства не занимают места в памяти, а операции их чтения и записи ассоциируются с обычными полями или методами. Это позволяет создавать необходимые сопутствующие эффекты при обращении к свойствам. Создание сопутствующего эффекта достигается тем, что за присваиванием свойству значения стоит вызов метода.
2. Объявление свойства выполняется с помощью зарезервированного слова property:
property propertyName[indexes]: type index integerConstant specifiers; |
Где:
propertyName – любой корректный идентификатор;
type – предопределенный или декларированный раньше тип;
specifiers – спецификаторы доступа;
[indexes] – необязательный параметр, который позволяет описать индексированное свойство (свойство-массив);
index integerConstant – необязательная секция, содержащая ключевое слово index и некоторую константу типа Integer (передается автоматически как параметр для методов, указанных в спецификаторах доступа), используется для методов, обслуживающих несколько свойств.
Простейший пример:
Type Tfigure = class private Fcolor:TColor; ... Protected
//Метод записи (установки значения)свойства Procedure setColor(c:TColor); virtual;
Property Color: TColor read Fcolor write setcolor; // Свойство end; |
3. При объявлении свойства используются ключевые слова: read, write, stored, default (nodefault) и implements, которые называются спецификаторами доступа. Каждое свойство должно обязательно содержать хотя бы один из спецификаторов: read, write.
read – указывается поле или метод, к которому происходит обращение при чтении (получении) значения свойства. Например, чтение свойства Color означает чтение поля Fcolor.
write — поле или метод, к которому происходит обращение при записи (установке) значения свойства. Например, установка свойства — вызов метода SetColor.
stored –
4. Чтобы имена свойств не совпадали с именами полей, последние принято писать с буквы F (от англ. field).
5. Обращение к свойствам выглядит в программе как обращение к полям:
var Fugure: TFigure; ... Figure.Color := red; // Эквивалентно Figure.SetColor(red); If Figure.Color = red then // Эквивалентно Figure.Fcolor; ShowMessage(‘Красный’); |
6. Если один из спецификаторов доступа опущен, то значение свойства можно либо только читать (задан спецификатор read), либо только записывать (задан спецификатор write). В следующем примере объявлено свойство, значение которого можно только читать.
7. В отличие от полей свойства не имеют адреса в памяти, поэтому к ним запрещено применять операцию @. Как следствие, их нельзя передавать в var- и out-параметрах процедур и функций.
8. Технология объектно-ориентированного программирования в среде Delphi предписывает избегать прямого обращения к полям, создавая вместо этого соответствующие свойства. Это упорядочивает работу с объектами, изолируя их данные от непосредственной модификации. В будущем внутренняя структура класса, которая иногда является достаточно сложной, может быть изменена с целью повышения эффективности работы программы. При этом потребуется переработать только методы чтения и записи значений свойств; внешний интерфейс класса не изменится.