6.1 Определения классов |
Вверх Предыдущий Следующий |
Класс определяется следующим образом: Тип класса
В объявлении класса, так как многие private (частные), protected (защищенные), published (опубликованые) и public (публичные) блоки могут быть использованы по мере необходимости: различные блоки можно повторять, и нет специального порядка, в котором они должны появляться. Методы являются обычными декларациями функций или процедур. Как видно, объявление класса практически идентично декларации объекта. Реальная разница между объектами и классами заключается в способе их создания (см далее в этой главе). Видимость различных разделов выглядит следующим образом: Private Strict Private Protected Public Published В синтаксической диаграмме, можно видеть, что класс может быть списоком реализуемых интерфейсов. Эта функция будет обсуждаться в следующей главе. Классы могут содержать Class methods (методы класса): это функции, которые не требуют экземпляра. Идентификатор Self действует в таких методах, но относится к самому классу указателя (на VMT класса).
При использовании предварительного определения класса, класс должен быть определен в том же блоке, в том же разделе (interface/implementation) (интерфейс/реализация). Но не обязательно должен быть определен в том же разделе type. Кроме того, можно определить опорные классы: Тип Опорный класс Тип опорного класса используются для создания экземпляров определенного класса, который пока не известен во время компиляции, но который указан во время выполнения. По сути, переменная ссылочного класса типа содержит указатель на определению указанного класса. Это может быть использовано для создания экземпляра класса, соответствующего определению, или проверить наследство. Следующий пример показывает, как это работает: Type TComponentClass = Class of TComponent; Function CreateComponent(AClass: TComponentClass; AOwner: TComponent): TComponent; begin // ... Result:=AClass.Create(AOwner); // ... end; Этой функции может быть передана ссылка на класс любого класса, который наследуется от TComponent. Вызов ниже является допустимым: Var C : TComponent; begin C:=CreateComponent(TEdit,Form1); end; При вызове функции CreateComponent, C будет содержать экземпляр класса TEdit. Обратите внимание, что следующий вызов не будет компилироваться: Var C : TComponent; begin C:=CreateComponent(TStream,Form1); end; потому что TStream не наследуется от TComponent, и AClass относится к классу TComponent. Компилятор проверит это во время компиляции, и выдаст ошибку. Ссылки на классы также могут быть использованы для проверки наследования: TMinClass = Class of TMyClass; TMaxClass = Class of TMyClassChild;
Function CheckObjectBetween(Instance : TObject) : boolean; begin If not (Instance is TMinClass) or ((Instance is TMaxClass) and (Instance.ClassType<>TMaxClass)) then Raise Exception.Create(SomeError) end; Приведенный выше пример вызовет исключение, если экземпляр не является потомком TMinClass или является потомком TMaxClass. Подробнее о экземпляре класса можно найти в следующем разделе 6.3 Экземпляр класса |