Описание свойств

Синтаксис

$ PropertyDeclarations = PropertyDeclaration_Old | PropertyDeclaration_New

 

$ PropertyDeclaration_Old = PROPERTY ident [ Indexes ] ":" ClassType Specifiers [ DEFAULT ";"]

$ Indexes = "(" [ISection {";" ISection}] ")"

$ ISection = ident ":" ClassType

$ Specifiers = ( GET ident | SET ident | GET ident SET ident ) ";"

 

$ PropertyDeclaration_New = PROPERTY ident [ Indexes ] ":" ClassType Specifiers_1 END PROPERTY ident ";" [ DEFAULT ";"]

 

$ Specifiers_1 = ( GetDeclaration | SetDeclaration | GetDeclaration SetDeclaration) ";"

$ GetDeclaration = GET BEGIN StatementSequence END GET

$ SetDeclaration = SET BEGIN StatementSequence END SET

Описание

Доступ к свойствам объекта определяется спецификаторами свойства - свойство может быть доступно только для чтения (GET), либо только для записи (SET), либо иметь полный доступ (GET и SET). В языке Fore поддерживается два синтаксиса для описания свойств (См. Синтаксис: $ PropertyDeclarations). При использовании нового способа объявления, для изменения значения свойства в процедуре Set необходимо использовать ключевое слово Value. Доступ к свойству может переадресовываться к полю объекта (если в качестве идентификатора указано имя поля) или инициировать вызов метода объекта (если в качестве идентификатора указано имя метода). Если при записи в свойство происходит вызов метода, то методу последним параметром передается значение для записи.

Примечание. Использование INHERITED для вызова SET-части базового свойства не поддерживается.

Также свойство может быть индексированным. В этом случае в качестве идентификаторов доступа к свойству должны быть указаны имена методов. При обращении к индексированному свойству методу первыми параметрами передаются значения индексов.

Директива DEFAULT устанавливается только для индексированных свойств и указывает, что данное свойство используется по умолчанию. То есть вместо обращения Obj.Prop(Index) можно использовать обращение Obj(Index).

Пример

В примере объявляются два класса, реализующих пользовательские коллекции строковых данных. Размер коллекции будет указываться при инициализации новой переменной. Для доступа к элементам коллекции используется свойство Item. Данное свойство доступно на чтение и запись, и объявлено свойством по умолчанию (доступ к данному свойству возможен без указания самого свойства, при указании только индекса необходимого элемента). Для доступа ко всей коллекции используется свойство Items, доступное только для чтения. Все значения будут храниться во внутреннем символьном массиве PropValue. В классе MyArray используется старый способ объявления свойств, в классе MyArray1 - новый. Работа с данными коллекциями в коде ни чем не отличается.

//Старый способ объявления свойств
Class MyArray: Object
    Private PropValue: Array Of String;

    Public Constructor Create(Length: Integer);
    Begin
        PropValue := New String[Length];
    End Constructor Create;

    Sub Set_Item(i: Integer; s: String);
    Begin
        PropValue[i] := s;
    End Sub Set_Item;

    Function Get_Item(i: Integer): String;
    Begin
        Return PropValue[i];
    End Function Get_Item;
    
    //Свойство по умолчанию
    Public Property Item(i: Integer): String Get Get_Item Set Set_Item; Default;
    
    Function Get_Items: Array Of String;
    Begin
        Return PropValue;
    End Function Get_Items;
    
    Public Property Items: Array Of String Get Get_Items;
End Class MyArray;

//Новый способ объявления свойств
Class MyArray1: Object
    Private PropValue: Array Of String;

    Public Constructor Create(Length: Integer);
    Begin
        PropValue := New String[Length];
    End Constructor Create;
    
    Public Property Item(i: Integer): String
        Get
        Begin
            Return PropValue[i];
        End Get
        Set
        Begin
            PropValue[i] := Value;
        End Set
    End Property Item; Default//Свойство по умолчанию

    Public Property Items: Array Of String
        Get
        Begin
            Return PropValue;
        End Get
    End Property Items;
End Class MyArray1;

Sub Main;
Var
    Arr: MyArray;
    Arr1: MyArray1;
    s: String;
    i: Integer;
Begin
    Arr := New MyArray.Create(2);
    Arr1 := New MyArray1.Create(2);
    Arr(0) := "Первый элемент";
    Arr.Item(1) := "Второй элемент";
    Arr1(0) := "Первый элемент второго массива";
    Arr1.Item(1) := "Второй элемент второго массива";
    //Элементы первого массива
    For i := 0 To Arr.Items.Length - 1 Do
        Debug.WriteLine(Arr.Item(i));
    End For;
    //Элементы второго массива
    For Each s In Arr1.Items Do
        Debug.WriteLine(s);
    End For;
End Sub Main;

После запуска процедуры Main будут созданы два экземпляра пользовательских коллекций: один экземпляр коллекции MyArray и один MyArray1. Размер каждой коллекции - два элемента. Так как свойство Item установлено свойством по умолчанию, то установка его значений возможна без указания наименования самого свойства. Значения элементов будут установлены различными способами. Для проверки установленные значения элементов коллекций будут выведены в консоль среды разработки.

См. также:

Описания и синтаксические правила | Описание классов