Свойства - это члены класса, которые обеспечивают доступ к характеристикам объекта. Свойства являются естественным расширением концепции полей, т.к. обеспечивают схожий синтаксис при работе с ними. Однако в отличие от полей, свойства не являются описателями ячеек памяти. Вместо этого свойства имеют методы доступа, которые определяют операторы выполняющиеся для получения или установки значения свойства. Другими словами свойства предоставляют механизм для связи определенных действий с операциями чтения/записи атрибутов объекта.
При определении свойства указывается его тип, имя, методы доступа, а также опционально его параметры.
Когда определение свойства содержит модификатор Shared такое свойство называется статическим. Когда модификатора Shared нет в определении свойства оно называется экземплярным.
Статическое свойство не оперирует конкретным экземпляром класса, является ошибкой компиляции использование конструкции Self в коде статического свойства. Экземплярное свойство оперирует определенным экземпляром класса, который может быть получен посредством конструкции Self.
Доступ к свойствам определяется методами доступа, которые указываются в коде свойства. Каждое из определений состоит из ключевого слова Get (свойство доступно на чтение) или Set (свойство доступно на запись). Для изменения значения свойства в теле Set необходимо использовать ключевое слово Value.
Class SharedProperty
Shared s: string;
o: object;
//Статическое свойство
Shared Public Property Version: string
Get
Begin
Return s;
End Get
Set
Begin
s := Value;
End Set
End Property;
//Экземплярное свойство
Public Property Object: object
Get
Begin
Return Self.o;
End Get
Set
Begin
Self.o := Value;
End Set
End Property;
End Class;
Sub Test();
Var
Obj: SharedProperty = New SharedProperty();
Begin
SharedProperty.Version := "Class";
Obj.Object := "Object";
End Sub;
Свойство, сигнатура которого содержит параметры, называется индексированным. Определение индексированного свойства позволяет работать с ним таким же образом как с массивом. Не допускается при определении параметров свойства использовать модификаторы Out и Var.
Допустима перегрузка параметрических свойств, т.е. определение нескольких свойств с одинаковым именем, но различными сигнатурами параметров.
Class IndexProperty
i: array Of integer;
Public Constructor IndexProperty(Length: integer);
Begin
i := New integer[Length];
End Constructor;
//Индексированное свойство
Public Property Item[Index: integer]: integer
Get
Begin
Return i[Index];
End Get
Set
Begin
i[Index] := Value;
End Set
End Property;
//Первое свойство GetNumCalculate с параметрами типа Integer
Public Property GetNumCalculate[x: Integer; y: Integer]: Double
Get
Var
Result: Double;
Begin
//Какое-либо вычисления над параметрами с типом Integer
Return Result;
End Get
End Property;
//Перегруженное свойство GetNumCalculate с параметрами типа Double
Public Property GetNumCalculate[x: Double; y: Double]: Double
Get
Var
Result: Double;
Begin
//Какое-либо вычисления над параметрами с типом Double
Return Result;
End Get
End Property;
End Class;
Sub Test();
Var
Obj: IndexProperty = New IndexProperty(1);
Result: Double;
Begin
Obj.Item[0] := 100;
//Получение значения первого свойства GetNumCalculate
Result := Obj.GetNumCalculate[100, 200];
//Получение значения перегруженного свойства GetNumCalculate
Result := Obj.GetNumCalculate[100.5, 200.5];
End Sub;
См. также: