Свойства

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

При определении свойства указывается его тип, имя, методы доступа, а также опционально его параметры.

Статические и экземплярные свойства

Когда определение свойства содержит модификатор 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[100200];
    
//Получение значения перегруженного свойства GetNumCalculate
    Result := Obj.GetNumCalculate[100.5200.5];
End Sub;

См. также:

Классы | Поля