Object Pascal

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

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

procedure DoSomething; virtual; abstract;

Обращение к неперекрываемому абстрактному методу вызывает ошибку времени выполнения (run time error), например:

Type

TClass2 = class(TClass0)

procedure Paint; virtual; abstract;

end;

TClass1 = class(TClass0)

procedure Paint; override;

end;

var

jClass1: TClass1;

jClass2: TClass2;

begin

jClass1.Paint; // правильно

jClass2.Paint; // неправильно: обращение к абстрактному методу

end;

Каждый класс имеет два особых метода конструктор и деструктор. Конструктор предназначен для создания класса, т. е. для выделения под него динамической памяти. Деструктор, наоборот, предназначен для уничтожения класса, т. е. для освобождения участка памяти, занятого этим классом. В классе TObject имеются стандартные методы Create (создать) и Destroy (уничтожить). В этом классе объявлен также метод Free, который сначала проверяет корректность адреса и только потом вызывает метод Destroy. В этой связи предпочтительнее использовать метод Free вместо метода Destroy. Всякий класс по умолчанию содержит переменную Self, в которую после выделения динамической памяти помещается адрес класса. Прежде чем выполнить обращение к методам класса, его нужно создать. Хотя конструктор и деструктор являются процедурами, они объявляются специальными словами. Конструктор объявляется словом Constructor, деструктор словом Destructor. Часто для обеспечения доступа к полям предка в конструкторе необходимо предварительно создать класс-предок. Это можно сделать c помощью слова Inherited.

Пример:

type

TShape = class(TGraphicControl)

Private {внутренние объявления}

FPen: TPen;

FBrush: TBrush;

procedure PenChanged(Sender: TObject);

procedure BrushChanged(Sender: TObject);

public {внешние объявления}

constructor Create(Owner: TComponent); override;

destructor Destroy; override;

...

end;

constructor TShape.Create(Owner: TComponent);

begin

inherited Create(Owner); // создание класса-предка TGraphicControl

Width := 65; // изменение наследуемых свойств TGraphicControl

Height := 65;

FPen := TPen.Create; // создание отдельного поля TPen типа class

FPen.OnChange := PenChanged;

FBrush := TBrush.Create; // создание отдельного поля TBrush типа class

FBrush.OnChange := BrushChanged;

end;

Некоторые простые классы могут быть созданы и уничтожены без объявления конструкторов и деструкторов. Например, если класс является потомком TObject, то в нем явно Constructor и Destructor в некоторых случаях объявлять нет нужды:

Type TClassy = class;

..

var Classy: TClassy;

Classy:= TClassy.Create; {создание класса}

Classy:= TClassy.Free; {уничтожение класса}

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

Пример:

Type TClassy = class;

Procedure HH(i, j: byte; var s: String); reintroduce; overload;

Procedure HH(q: String); reintroduce; overload;

Procedure HH(a: array oh Integer); reintroduce; overload;

implementation

Procedure TClassy.HH(i, j: byte; var s: String);

Begin

S:=IntToStr(i + j);

End;

Procedure TClassy.HH(q: String);

Begin

L2.Cattion:= q;

End;

Procedure TClassy.HH(a: array oh Integer);

Begin

L1.Cattion:= IntToStr(a[6] + a[4]);

End;

Теперь, после обращения к методу по имени TClassy.HH, программа вызовет именно тот метод, формальные параметры которого соответствуют фактическим параметрам в обращении.

18.5. Свойства класса

Свойства, как и поля, являются атрибутами класса. Свойства объявляются с помощью слов property, read и write. Слова read и write конкретизируют назначение свойства. Синтаксис свойства таков:

property propertyName[indexes]: type index integerConstant specifiers;

где propertyName имя свойства; [indexes] параметры-имена в форме имя1, имя2, ... , имяN: type; index целая константа; read, write, stored, default (или nodefault) и implements спецификации. Всякое объявление свойства должно иметь одну из спецификаций read или write или обе вместе.

Примеры:

property Objects[Index: Integer]: TObject read GetObject write SetObject;

property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;

property Values[const Name: string]: string read GetValue write SetValue;

property ErrorCount: Integer read GetErrorCount;

property NativeError: Longint read FNativeError;

Неиндексированные свойства похожи на обычные поля, а индексированные свойства напоминают поля-массивы. В программе свойства ведут себя почти так же, как обычные поля. Разница в том, что свойство имеет более ответственное назначение. Например, оно может активизировать некоторые методы для придания объектам требуемого свойства. Так если изменено свойство шрифта какого-либо визуального класса, то смена свойства шрифта повлечет за собой перерисовку текста и выполнение ряда сопутствующих операций, которые обеспечат классу именно такое свойство.

Каждое свойство может иметь спецификацию read или write или оба вместе в форме

read fieldOrMethod

write fieldOrMethod

где fieldOrMethod имя поля или метода, объявленного в классе, или свойство класса-предка.

Если fieldOrMethod объявлено в классе, то оно должно быть определено в том же классе. Если оно объявлено в классе-предке, то оно должно быть видимо из потомка, т. е. не должно быть частным полем или методом класса-предка. Если свойство есть поле, то оно должно иметь тип. Если fieldOrMethod есть read-спецификац?/p>