1. Қарапайым қолданба.
2. Қолданба интерфейсін жасау.
3. Қолданбаның функционалдылығын анықтау.
Интерфейстер -COM (Component Object Model — объектілердің компоненттік моделі), COBRA (Common Object Request Broker Architecure — жалпы объектілерді талап ететін брокерлі архитектура) технологияларында және осыған байланысты қашықтықтан кіру мүмкіндігі бар технологияларда басты роль атқарады. басқа сөзбен айтқанда, басқа машинада орналасқан объектілер объектілерге кіру технологиясы. Оның негізгі міндеті — алыстағы объектінің қасиетін, әдісін және оқиғасын сипаттау, яғни программалау тілінде клиентке арналған қосымшаны жасауда пайдаланылады. Егер ол өзінің жеке меншік объектісі болса, интерфейститің көмегімен клиент программасы алыстағы объектіге қатынас жасайды.
Интерфейстер тақырыбының ауқымы өте кең және қызықты да. Бірақ интерфейстер жөніндегі жалпы түсінікпен ғана шектелеміз. Интерфейс дегеніміз — бос класс.
Интерфейстің құрылуы және пайдаланылуы
Интерфейстер типтерді сипаттаудың дербес жағдайы. олар interface қызметші сөзінің көмегімен хабарланады. Мысалы,
Type
IEdit=interface
Procedure Copy;stdcall;
Procedure Cut;stdcall;
Procedure Paste;stdcall;
Function Undo;stdcall;
End;
Мұндағы хабарлау абстракт класты сипаттаумен бірдей, яғни интерфейсті шақыру ондағы хабарланған қасиеттер мен әдістерді талдауды талап етпейді.
Кластардан айырмашылығы интерфейстің өрістері болмайды, сондықтан ондағы read және write бөлімінде хабарланған қасиеттер тек әдіске ғана сілтеме жасауы мүмкін. Интерфейсте хабарланған барлық мүшелер тек Public секциясында орналасады.
Әдістер абстракт (abstract), виртуалды (virtual), динамикалық (dinamic) немесе жабылатын (override) бола алмайды. Интерфейстерде конструкторлар немесе деструкторлар болмайды, яғни ондағы сипатталған әдістер тек оны сүйемелдейтін кластың шеңберінде ғана жүзеге асырылады, ол интерфейстің аты оның аталық тізіміндегі кластың хабарлануында көрсетіледі:
TEditor=class(TInterfacedObject,IEdit)
Procedure Copy;stdcall;
Procedure Cut;stdcall;
Procedure Paste;stdcall;
Function Undo:Boolean;stdcall;
End;
Әдеттегі кластан интерфейстік кластың айырмашылығы оның бірнеше аталық интерфейсі болуы мүмкін:
Type
IMyInterface=interface
Procedure Delete; stdcall;
TmyEditor=class(TInterfacedObject,IEdit,IMyInterface)
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,x2,y1,y2,R:integer);
End;
Кез келген жағдайдағы интерфейстік класты жүзеге асыру бөлімінде сәйкес интерфейстік әдістерді сипаттау қажет. Мысалы, егер интерфейс хабарланған болса
IPaint=interface
ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);
Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);
End;
және оның интерфейстік класын пайдаланатын болса,
TPainter=class(TInterfaceObject, Ipaint)
ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);
Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R: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.CirclePaint(Canva:TCanvas; x1,y1,x2,y2,R:integer);
begin
With Canva do
Rectabgle(x1,y1,x2,y2);
End;
Енді шеңбер және квадрат сызу үшін кластың интерфейстік объектісін хабарлауға болады:
Procedure Tform1.PaintBoxPaint(Sender:TObject);
var
Painter:IPaint;
begin
Painter:=TPainter.Create;
Painter.CirclePaint(PaintBox1.Canvas,10,0,10);
Painter.RectPaint(PaintBox1.Canvas,40,0,60,20);
End;
Интерфейс оның пайдаланатын интерфейстік класын хабарлағанға дейін хабарланатындығын қарамастан, оның әдістерінің кластың хабарлауында келтірілетіні міндетті екені компиляторға белгілі. Біздің жағдайда оны былай көрсетуге болады:
Type
TPainter=class(TInterfaceObject,IPaint)
End;
Мұнда жазу қате болар еді: компилятор CirclePaint және RectPaint әдістерінің сипатталуын қоюды талап етер еді.
Сондай-ақ, Object Pascal тілінің барлық кластары жалғыз аталық класс Tobject класынан туындағаны тәрізді барлық интерфейстік кластар TinterObject жалпы аталығынан туындаған. Бұл аталық жадыны интерфейстік объектілер үшін үлестіре алады және Iunknow глобальды интерфейсін пайдаланады:
Type
TinterfacedObject=class(TObject,IUnknown)
Private
Frefcount:integer;
Protected
Function QueryInterface(constIID:TGUID; outObj):integer;stdcall;
Function_AddRef:integer;stdcall;
Function_Relefse:integer;stdcall;
Public
Property RefCount:integer read FrefCount;
End;
Егер алдыңғы мысалда Tpainter класы төмендегідей сипатталған болса:
TPainter=class(TPaint)
ProcedureCirclePaint(Canva:Tcanvas; x,y,R:integer);
Procedure RectPaint(Canva:Tcanvas; x1,x2,y1,y2,R:integer);
End;
Онда компилятор TinterfaceObject класының QueryInterface_Add_Release әдістерін қосуды талап етер еді. Бұл кластың FrefCount өрісі интерфейстік объектіні шақыру есептегішінің қызметін атқарады және Windows схемасында қабылданғанындай пайдаланылады: Iunknow интерфейсінің Add әдісіне әрбір оралған сайын есептегіш 1-ге артады, ал Release әдісіне оралған сайын есептегіш 1-ге кемиді. Бұл өрістің мәні нольге тең болғанда интерфейстік объект жойылып, жадыдан алған орнын босатады.
Интерфейстік объектіге as типтерді келтіру операторын қолдануға болады, бұл жағдайда керекті интерфейс таңдалады:
Procedure PaintObject(P:TInterfacedObject)
Var x:IPaint
begin
Try
X:PasIPaint;
X.CirclePaint(PaintBox1.Canvas,0,0,20)
Except
ShowMessage('объект IPaint интерфейсін сүйемелдемейді')
End; end;
Мұндай меншіктеуді кездестіргеннен кейін компилятор код құрады және оның көмегімен Ipaint интерфейсіне сілтеме жасауды шақырылады. Егер объект көрсетілген интерфейсті сүйемелдемейтін болса, шектен тыс жағдай пайда болады.
қашықтықтағы объектіні пайдалануға есептелген интерфейстер глобальды бірегей идентификатормен жабдықталуы тиіс (Guid). Мысалы,
IPaint=interface
['{AYAFEB60-7705-11D2-8B-41-4444553540000}']
ProcedureCirclePaint(Canva:TCanvas; x,y,R:integer);
ProcedureRectPaint(Canva:TCanvas; x1,y1,x2,y2:integer);
End;
Implements қызметші сөзінің көмегімен программист кейбір класқа қандай да бір қасиетті қоса алады. Бұл қасиеттің типі интерфейс немесе класс болуы мүмкін. Егер қасиеттің типі интерфейс болса, бұл интерфейстің аты аталық кластар тізімінде көрсетілуі тиіс, яғни интерфейстік кластағыдай:
Type
IMyInterface=interface
Procedure P1; Procedure P2;
End;
TMyClass=class(TObject,IMyInterface)
IMyInterface=IMyInterface;
Property MyInterface:IMyInterface
Read FMyInterface implements ImyInterface;
End;
Мұнда мына мәселеге көңіл аудару қажет: мысалдағы TmyClass интерфейстік класс болып табылмайды, яғни Р1 және Р2 әдістері орындалатын класс.
Егер одан MyInterface өкілетті қасиетін анықтауды алып тастаса, онда ол интерфейстік болып табылады және MyInterface әдісін сипаттау қажет.
Өкілетті қасиетте міндетті түрде read болуы тиіс. Егер оның типі класс болса және ол сол хабарланған болса, оның басқа өкілетті қасеиттерінің болуы мүмкін емес.