Описание классов

Синтаксис

$ ClassDeclaration = CLASS ident ":" BaseClass [{“, ImplInterface”}]

MemberList

END CLASS ident ";"

 

$ BaseClass = qualident

$ ImplInterface = qualident

 

$ MemberList = [ MemberDeclaration { MemberDeclaration }]

$ MemberDeclaration = ( ConstDeclaration | FieldDeclaration | MethodDeclaration | PropertyDeclarations | ConstructorDeclaration )

 

$ ConstDeclaration = CONST ConstEntry

 

$ FieldDeclaration = [ SHARED ] ( IdentList ":" ClassType ) | ( ident ":" ClassType ["=" ConstExpression ] ) ";"

 

$ MethodDeclaration = ( [ SHARED ] | [ FINAL ] ) ProcedureDeclaration

 

$ ConstructorDeclaration = ConstructorHeading ";" ConstructorBody

$ ConstructorHeading = CONSTRUCTOR ident “(“ [FormalParameters] “)”

$ ConstructorBody = BEGIN StatementSequence

END CONSTRUCTOR ident ";"

 

$EventDeclaration = EVENT ident ":" EventType

$EventType = qualident

Описание

Язык Fore позволяет описывать пользовательские классы и использовать их в своих программах.

Для определения пользовательских классов необходимо их наследовать от некоторого класса. В качестве родительского класса может выступать как базовый класс, так и уже определенный пользовательский. В общем случае класс наследуется от Object. По умолчанию, класс имеет модификатор доступа Private. Класс может содержать поля, свойства и процедуры (или так называемые методы). Для обращения к полям, свойствам или методам объекта-экземпляра класса используется синтаксис, при котором указывается:

<имя объекта>.<имя поля>

или:

<имя объекта>.<имя свойства>

или:

<имя объекта>.<имя метода>.

Обращение к полям объекта аналогично обращению к переменным, обращение к методам – обращению к процедурам.

Класс может реализовывать ряд интерфейсов. Это означает, что класс должен содержать реализацию всех членов, описанных в интерфейсах.

Предварительное описание классов отсутствует. Любой класс может быть использован, если его описание встречается в данном модуле или в одном из импортируемых. Но при этом, предок любого класса должен быть определен до того, как от него будут наследоваться классы-потомки.

Конструкторы

Существует стандартный метод - CONSTRUCTOR (Create). Метод Create вызывается при создании объекта с помощью оператора NEW. Метод предназначен для инициализации объекта. Допускается вызов метода для уже созданного объекта, при этом будет выполняться только код метода (без выделения памяти и инициализации полей объекта). Все объекты уничтожаются автоматически, когда не остается ссылок на объекты.

Тело метода может содержать вызов INHERITED, который будет вызывать метод родительского класса.

$ inheritcall = INHERITED ProcedureCall

Self

Для того чтобы внутри метода класса получить ссылку на объект, для которого будет вызван данный метод, можно воспользоваться идентификатором Self. Предопределенный идентификатор Self имеет смысл только для методов класса, попытки его использования в других местах программы будут приводить к ошибке компиляции.

Статические и завершенные члены класса

Директива SHARED указывает на то, что данный метод или поле являются методом или полем класса соответственно (статические члены класса). Статические методы и поля не являются частью определенного экземпляра класса. Вне зависимости от того какое количество экземпляров класса создано существует только одна копия статического поля. Статические поля начинают свое существование после первого обращения к ним и прекращает при завершении существования домена приложения.

Примечание. Значения статических полей уникальны в рамках разных соединений с одним и тем же репозиторием.

В нестатических членах могут использоваться любые статические и нестатические члены класса. В статических членах могут использоваться только статические члены класса. Для обращение к статическим членам внутри класса можно использовать идентификатор Self или просто указывать наименование статического члена.

Директива FINAL указывает на то, что данный метод не может быть переопределён в потомках данного класса.

События класса

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

Пример

Class SampleClass: Object
    
Private Shared Temp: Integer;

    
Public Shared Sub Test;
    
Begin
        Temp := TestEx(
1);
        
//...
    End Sub Test;

    
Public Shared Function TestEx(Index: Integer): Integer;
    
Var
        i: Integer;
    
Begin
        
//...
        Return i;
    
End Function TestEx;

    
Public Sub CreateSettings(Count: Integer);
    
Begin
        
//...
        If Count < 1 Then
            
//Вызов метода через Self
            Self.Test;
        
Else
            
//Вызов метода без использования Self
            Temp := TestEx(Count);
        
End If;
    
End Sub CreateSettings;

    
Public Final Property GetValue: Integer
        
Get
        
Begin
            
//...
            Temp := Correct(Temp);
            
//...
            Return Temp;
        
End Get
    
End Property GetValue;

    
Private Function Correct(Value: Integer): Integer;
    
Var
        i: Integer;
    
Begin
        
//...
        Return i;
    
End Function Correct;
End Class SampleClass;

См. также: