Классы и объекты

Язык программирования Fore является объектно-ориентированным. Классы используются для описания объектов, хранения их данных и реализации алгоритма работы. Определение класса включает в себя константы и поля, в которых хранятся данные объекта, и члены класса, которые оперируют этими данными: конструкторы, свойства, методы (процедуры/функции) и события.

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

Public Class TUserInfo: Object
    
//Поля для хранения значений внутри объекта класса
    _FirstName, _LastName: String;

    
//Конструктор объекта
    Public Constructor Create(Name: String = "");
    
Begin
        _FirstName := Name;
    
End Constructor Create;

    
//Свойства объекта
    Public Property FirstName: String
        
Get
        
Begin
            
Return _FirstName
        
End Get
        
Set
        
Begin
            _FirstName := Value
        
End Set
    
End Property FirstName;

    
Public Property LastName: String
        
Get
        
Begin
            
Return _LastName
        
End Get
        
Set
        
Begin
            _LastName := Value
        
End Set
    
End Property LastName;

    
//Методы, доступные только внутри класса
    Sub Serialize;
    
Begin
        
//...
    End Sub Serialize;

    
Sub Deserialize;
    
Begin
        
//...
    End Sub Deserialize;
End Class TUserInfo;

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

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

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

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

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

Public Constructor CreateNew;
Begin
    
Inherited Create;
    
//...
End Constructor CreateNew;

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;

См. также:

Руководство по языку Fore | Создание объектов | Свойства класса | Делегаты и события | Интерфейсы