»нтерфейсы не могут иметь конструкторов и деструкторов, так как описываемые в них методы реализуютс¤ только в рамках поддерживающих их классов, которые называютс¤ компонентными (co-classes). ќднако в данной книге термин «компонентный класс» имеет самосто¤тельное значение, поэтому вместо него применительно к интерфейсам поддерживающие классы будем называть интерфейсными.

≈сли класс поддерживает интерфейс, им¤ этого интерфейса указываетс¤ при объ¤влении класса в списке его родителей:

TEditor = class(TInterfacedObject, IEdit)
procedure Copy;
stdcall;
procedure Cut;
stdcall;
procedure Paste;
stdcall;
function Undo: Boolean;
stdcall;
end;

¬ отличие от обычного класса, интерфейсный класс может иметь более одного родительского интерфейса:

type IMylnterface » interface

procedure Delete;
stdcall;
end;
TMyEditor = class(TInterfacedObiect, IEdit, IMylnterface)
procedure Copy;
stdcall;
procedure Cut;
stdcall;
procedure Paste;
stdcall;
function Undo: Boolean;
stdcall;
procedure Delete;
stdcall;
end;

¬ любом случае в разделе реализации интерфейсного класса необходимо описать соответствующие интерфейсные методы. ѕусть, например, объ¤влен следующий интерфейс:

IPaint = interface

procedure CirclePaint(Canva: TCanvas;
X,Y,R: Integer);
procedure RectPaint(Canva: TCanvas;
X1,Y1,X2,Y2: Integer);
end;

ѕусть также объ¤влен поддерживающий его интерфейсный класс:

«*

TPainter = class(TInterfacedObject, IPaint)
procedure CirclePaint(Canva: TCanvas;
X,Y,R: Integer);
procedure RectPaint(Canva: TCanvas;
X1,Y1,X2,Y2: Integer);
end;

“огда в разделе implementation следует указать реализацию методов:

procedure TPainter.CirclePaint(Canva: TCanvas;
X, Y,R: Integer);
begin
with Canva do
Ellipse(X, Y, X+2*R, Y+2*R);
end;
procedure TPainter.RectPaint(Canva: TCanvas;
XI, Y1,X2,Y2: Integer) ; begin
with Canva do
Rectangle(XI, Yl, X2, Y2)
end;

“еперь можно объ¤вить интерфейсный объект класса IPaint, чтобы с его помощью нарисовать окружность и квадрат:

procedure TForml.PaintBoxlPaint(Sender: TObject); var
Painter: IPaint;
begin
Painter := TPainter.Create;
Painter.CirclePaint(PaintBoxl.Canvas,10,0,10) ; Painter.RectPaint(PaintBoxl.Canvas,40,0,60,20);
end;

Ќесмотр¤ на то что интерфейс всегда объ¤вл¤етс¤ до объ¤влени¤ поддерживающего его интерфейсного класса и, следовательно, известен компил¤тору, его методы об¤зательно должны быть перечислены в объ¤влении интерфейсного класса. ¬ нашем случае простое объ¤вление интерфейсного класса, как это показано ниже, было бы ошибкой: компил¤тор потребовал бы вставить описание методов CirclePaint и RectPaint.

type TPainter = class(TInterfacedObject, IPaint) end;

1.2. »нтерфейсы || ќглавление || 1.2.3.  ласс TInterfacedObiect и интерфейс IUnknow


Искусство создания компонентов Delphi



Новости за месяц

  • Август
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс