|
Class
Объявление класса в секции type
-
type Name = {packed} class
Definitions...
{class function|procedure ...}
end;
-
type Name = class(BaseClass);
-
type Name = class;
-
type Name = {packed} class(BaseClass)
Class definition...
end;
-
type Name = {packed} class(BaseClass {,Interfaces})
Class definition...
end;
-
type MetaClassName = class of class type;
Описание:
Ключевое слово Class - это центральная часть
объектно-ориентированного кода. Оно начинает определение "класса" - объектного
типа данных.
Определение содержит так
называемых "членов" - данные и методы (подпрограммы). Когда создается объект
класса, он самостоятелен - вы можете получить доступ к данным и методам объекта
независимо от любых других объектов. Он похож на запись Delphi, но с активными
компонентами - методами.
Эти элементы
определены в определении класса. Элементы-методы реализованы в секции реализации
модуля. Объявление класса имеет типичный вид:
type
ИмяКласса = class(БазовыйКласс)
private
// определения данных/методов локальных
для этого модуля
protected
//
определения данных/методов локальных для этого модуля + для потомков
public
// определения данных/методов
используемых всеми объектами этого класса
published
// доступные извне публичные объявления
end;
При создании экземпляра объекта этого
класса могут быть переданы параметры. Они передаются в методе-конструкторе
класса. При этом вместо function или method используется слово constructor. Вы
можете создать несколько конструкторов для разных наборов параметров. Это
реализуется с использованием ключевого слова overload в конце определения
конструктора.
Обычно метод-конструктор
называется Create.
См. код для примера.
Когда объект уничтожается, вызывается
метод-деструктор. Вы можете его использовать для выполнения специфических
действий перед тем, как память объекта будет освобождена.
Обычно метод-деструктор называется Destroy.
Существуют несколько способов использования
слова Class:
1. Определение класса, основанном
на TObject по умолчанию. Все классы должны быть основаны на другом классе, или
по умолчанию на TObject, классе высшего уровня. TObject предоставляет простейшую
функциональность - обычно вам приходится определять все данные и методы самому,
не используя ни одного из TObject.
Внутри
определения класса, вы можете добавлять в качестве префикса к определениям
функций или процедур с ключевое слово Class. Это позволяет методам быть
вызванным из самого класса в дополнение к возможности вызова из экземпляра
объекта этого класса. Так как класс - это не настоящий объект, то память под
него не выделяется. Поэтому методы класса не должны обращаться ко внутренним
данным класса.
2. Определение класса основанное
на заданном классе, но без дополнений или изменений. Вы получите новый класс,
работающий идентично базовому(BaseClass).
3.
Опережающее объявление классов. Оно позволяет всем классам в модуле быть
перечисленными в начале секции объявления типов. Это очень удобно.
4. Определение класса, основанное на заданном
классе. Как на 1 выше, но в можете задать, на каком классе будет основан ваш
новый класс. Ваш класс будет смесью определений предка и локальных определений.
5. Класс может содержать реализации внешних
предопределенных интерфейсов.
6. Ссылка на
метакласс позволяет переменной быть использованной в качестве ссылки на класс, а
не на объект.
Пример кода:
// Full Unit code.
//
-----------------------------------------------------------
// You must
store this code in a unit called Unit1 with a form
// called Form1 that has
an OnCreate event called FormCreate.
unit Unit1;
interface
uses
SysUtils, Forms, Dialogs;
type
// Define the classes in this Unit at the very start for
clarity
TForm1 = Class; // This is a forward class definition
TFruit = Class(TObject) // This is an actual class
definition :
// Internal class field definitions -
only accessible in this unit
private
isRound : Boolean;
length : single;
width : single;
diameter : single;
// Fields and methods only accessible by this class
and descendants
protected
// Externally accessible fields and methods
public
//
2 constructors - one for round fruit, the other long fruit
constructor Create(diameter : single);
overload;
constructor Create(length :
single; width : single); overload;
// Externally
accessible and inspectable fields and methods
published
// Note that properties must
use different names to local defs
property round : Boolean
read isRound;
property len : single
read length;
property wide : single
read width;
property diam : single
read diameter;
end; // End of the TFruit class definition
// The actual TForm1 class is now defined
TForm1 = Class(TForm)
procedure FormCreate(Sender: TObject);
procedure ShowFruit(fruit : TFruit);
private
// No local data
public
// Uses just the TForm
ancestor class public definitions
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// Create a round fruit object
constructor TFruit.Create(diameter:
single);
begin
// Indicate that we have a round fruit, and
set its size
isRound := true;
self.diameter :=
diameter;
end;
// Create a long fruit object
constructor
TFruit.Create(length, width: single);
begin
// Indicate
that we have a long fruit, and set its size
isRound := false;
self.length := length;
self.width := width;
end;
// Form object - action taken when the form is created
procedure TForm1.FormCreate(Sender: TObject);
var
apple, banana : TFruit;
begin
// Let us create our fruit
objects
apple := TFruit.Create(3.5);
banana :=
TFruit.Create(7.0, 1.75);
// Show details about our fruits
ShowFruit(apple);
ShowFruit(banana);
end;
// Show what the characteristics of our fruit are
procedure
TForm1.ShowFruit(fruit: TFruit);
begin
if fruit.round
then ShowMessage('We have a round fruit, with diam = '+
FloatToStr(fruit.diam))
else
begin
ShowMessage('We have a long fruit');
ShowMessage(' it has length =
'+FloatToStr(fruit.len));
ShowMessage(' it has
width = '+FloatToStr(fruit.wide));
end;
end;
end.
Результат выполнения:
We have a round fruit with diam = 3.5
We have a long fruit
it has a length = 7
it has a width = 1.75
|
|