Описание |
Ключевое слово Class это центральная часть Объектно-ориентированного кода.
Это определение содержит так называемые 'члены' - данные и методы (подпрограммы). Когда объект класса создан, он становится автономным элементом - вы можете обратиться к данным и методам объекта независимо от любого другого объекта. Оно похоже на запись Delphi, но с активными компонентами - методами.
Эти элементы определены в определении типов класса. Элементы метода осуществлены в разделе implementation модуля.
Объявление класса имеет следующее типичное описание :
type
className = class(BaseClass)
private
// Определения данных/методов локальные для этого модуля
protected
// Определения данных/методов, локальных для этого класса + потомки
public
// Определения данных/методов пригодных для использования всеми объектами этого класса
published
// Внешне общественные определения
end;
Параметры можно передать при создании объектного образца класса. Они передаются методу Constructor класса. Слово Constructor используется вместо функции или метода. Вы можете иметь множество конструкторов для различных наборов параметра. Они снабжены ключевым словом overload; после конца определения конструктора.
Обычно, название метода конструктора - Create.
См. код для примера.
Когда объект разрушают, вызывают метод Destructor. Вы можете использовать его, чтобы предпринять специальное действие прежде, чем объектная память будет исправлена.
Обычно, название метода деструктора - Destroy.
Есть множество использований слова Class:
1. Определение класса базируется, по умолчанию на классе TObject. Все классы должны быть основаны на другом классе, с классом TObject, в самом верхнем уровне.
В пределах определений класса, Вы можете приставлять определения функции или процедуры с ключевым словом Class. Это позволяет подпрограмме быть вызванным из самого Класса в дополнение к объектному образцу класса. Поскольку класс - не реальный объект, он не имеет никакой памяти, распределенной для данных. Так что подпрограмма Класса должна работать бех ссылок на внутренние данные класса.
2. Определение класса базируются на указанном классе, но без местных добавлений или изменений. Вы имеете новый класс, который действует тождественно к классу BaseClass
3. Ускоренное объявление класса. Оно позволяет всем классам в модуле быть перечисленными в начале раздела type. Так что это вопрос удобства, а не чего-нибудь еще.
4. Определение класса базируется на указанном классе. Как 1-ый выше, но вы можете определить, на каком классе вы базируете ваш новый класс. Вашим классом будет смесь предка и местных объявлений.
5. Класс может содержать выполнение внешне предопределенных интерфейсов.
6. Ссылка metaclass позволяет переменной быть использованной для указания класса, а не объекта.
|
|
Примечания |
Дополнительное ключевое слово packed говорит Delphi, чтобы он минимизировал память взятую классом. Это прекращает выравнивать данные относительно 2, 4-или 8-байтовых границ.
|
|
Похожие команды |
Constructor Определяет метод используемый для создания объекта из класса
Interface Используется для внешних определений модуля, и как скелет класса
Object Позволяет данным типа подпрограмм обращаться к методу объекта
Private Начинает частный (Private) раздел данных и методов в классе
Property Определяет управляемый доступ к полям класса
Protected Начинает раздел класса частных данных доступных подклассам
Public Начинает внешне доступный раздел класса
Published Начинается изданный, внешне доступный раздел класса
TObject Тип базового класса, который является предком для всех других классов
Virtual Позволяет методу класса быть отменённым в производных классах
Dynamic Позволяет методу класса быть заменённым в производных классах
| |
|
Пример кода : Модуль с 2 определениями класса и кодом, который использует оба класса |
// Полный код Модуля. // ----------------------------------------------------------- //
Вы должны поместить этот код в модуль с именем Unit1 и с формой //
названную Form1, которая имеет событие OnCreate названное FormCreate.
unit Unit1;
interface
uses
SysUtils, Forms, Dialogs;
type // Определение классов в самом
начале этого Модуля для ясности TForm1 = Class; //
Это опережающее определение класса
TFruit = Class(TObject) //
Это фактическое определение класса : //
Внутреннее определение полей класса - доступны только в этом модуле
private
isRound : Boolean;
length : single;
width : single;
diameter : single; //
Поля и методы, доступные только для этого класса и потомков
protected //
Внешне доступные поля и методы
public // 2 конструктора - один для круглого фрукта, другой для удлинённого фрукта (fruit)
constructor Create(diameter : single); overload;
constructor Create(length : single; width : single); overload; //
Внешне доступные и видимые поля и методы
published //
Обратите внимание, что свойства должны использовать разные имена для местных
определений
property round : Boolean
read isRound;
property len : single
read length;
property wide : single
read width;
property diam : single
read diameter; end; // Конец определения класса TFruit
// Фактически, класс TForm1 теперь
определен
TForm1 = Class(TForm)
procedure FormCreate(Sender: TObject);
procedure ShowFruit(fruit : TFruit);
private // Нет
локальных данных
public //
Используются только публичные определения предков класса TForm
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// Создание круглого объекта fruit
constructor TFruit.Create(diameter: single);
begin // Указываем, что мы имеем
круглый fruit, и установка его размера
isRound := true;
self.diameter := diameter;
end;
// Создание удлинённого объекта fruit
constructor TFruit.Create(length, width: single);
begin // Указываем, что мы имеем
удлинённый fruit, и установка его размера
isRound := false;
self.length := length;
self.width := width;
end;
// Объект формы - действие, предпринимаемое,
когда форма создана
procedure TForm1.FormCreate(Sender: TObject);
var
apple, banana : TFruit;
begin // Позволяет нам создавать наши
fruit объекты
apple := TFruit.Create(3.5);
banana := TFruit.Create(7.0, 1.75);
// Показ подробностей о наших фруктах
ShowFruit(apple);
ShowFruit(banana);
end;
// Показ, каковы характеристики нашего плода
procedure TForm1.ShowFruit(fruit: TFruit);
begin
if fruit.round
then ShowMessage('Мы имеем круглый фрукт с диаметром = '+
FloatToStr(fruit.diam))
else
begin
ShowMessage('Мы имеем удлинённый фрукт');
ShowMessage(' его длина = '+FloatToStr(fruit.len));
ShowMessage(' его ширина = '+FloatToStr(fruit.wide));
end;
end;
end.
|
Мы имеем круглый фрукт с диаметром = 3.5
Мы имеем удлинённый фрукт
его длина = 7
его ширина = 1.75
|
|