Delphi-6 - среда разработки программного обеспечения для систем промышленной автоматизации. Букреев В.Г - 77 стр.

UptoLike

Составители: 

Painter.RectPaint(PaintBoxl.Canvas,40,0,60,20);
end;
Несмотря на то что интерфейс всегда объявляется до объявления
использующего его интерфейсного класса и, следовательно, известен
компилятору, его методы обязательно должны быть перечислены в объ-
явлении класса. В нашем случае простое указание
type
TPainter = class(TInterfacedObject, IPaint)
end;
было бы ошибкой: компилятор потребовал бы вставить описание мето-
дов CirclePaint и RectPaint.
Подобно тому, как все классы в Object Pascal порождены от един-
ственного родителя TObject, все интерфейсные классы порождены от
общего предка TInterfacedObject. Этот предок умеет распределять па-
мять для интерфейсных объектов и использует глобальный интерфейс
lunknow:
type
TInterfacedObject = class(TObject, lUnknown) private
FRefCount: Integer;
protected
function Querylnterface(const IID: TGUID; out Obj): Integer;
stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
property RefCount: Integer read FRefCount;
end;
Если бы в предыдущем примере класс TPainter был описан так:
TPainter = class(IPaint)
procedure CirclePaint(Canva: TCanvas; X,Y,R: Integer);
procedure RectPaint(Canva: TCanvas; X1,Y1,X2,Y2: Integer);
end;
компилятор потребовал бы описать недостающие методы Queryinterface,
_AddRef и _Release класса TInterfacedObject. Поле RefCount этого клас-
са служит счетчиком вызовов интерфейсного объекта и используется по
принятой в Windows схеме: при каждом обращении к методу Add ин-
терфейса IUnknow счетчик наращивается на единицу, при каждом об-
ращении к Release – на единицу сбрасывается. Когда значение этого по-
77