Interfețe joacă un rol major în tehnologia COM (Component Object Model - Component Object Model), CORBA (Common Object Cerere Broker Arhitectura - broker de arhitectura necesare obiecte partajate) și a tehnologiilor de acces la distanță asociate, de exemplu, tehnologii de acces obiect situat .. (și funcționarea) pe o altă mașină. Sarcina lor principală este de a descrie proprietățile, metodele și evenimentele obiectului la distanță în termenii mașinii client, adică limbajul de programare utilizat în dezvoltarea aplicației client. Cu ajutorul interfețelor, programul client accesează obiectul la distanță ca și cum ar fi obiect propriu.
Tema interfeței este destul de extinsă și interesantă. Acest capitol oferă doar cele mai generale informații despre interfețe. Reducerea acestui subiect într-un singur capitol cu clasele nu întâmplător, adică. Pentru a. Interfața este o clasă goală, adică. E. O clasă care a proclamat, dar nu proprietăți și metode de decriptat.
Interfețele sunt un caz special de descrieri de tip. Acestea sunt declarate utilizând interfața cuvântului rezervat. De exemplu:
Spre deosebire de clase, interfața nu poate conține câmpuri și, prin urmare, proprietățile declarate în ele în secțiunile de citire și scriere se referă numai la metode. Toți membrii declarați în interfață sunt plasați într-o singură secțiune publică. Metodele nu pot fi abstracte, virtuale, dinamice sau suprasolicitate. Interfețele nu pot avea constructori sau destructori, deoarece metodele descrise în ele sunt implementate numai în cadrul claselor de suport care se numesc clase de interfață.
Spre deosebire de o clasă obișnuită, clasa de interfață poate avea mai mult de o interfață mamă:
În orice caz, în secțiunea de implementare a clasei de interfață, trebuie să descrieți metodele de interfață corespunzătoare. Dacă, de exemplu, este declarată o interfață
și folosind clasa de interfață
apoi în secțiunea de implementare specificați implementarea metodelor:
Acum puteți declara o interfață, un obiect TPainter, pentru a desena un cerc și un pătrat cu el:
ar fi o greșeală: compilatorul ar fi cerut o descriere a metodelor CirclePaint și RectPaint.
La fel cum toate clasele din Object Pascal sunt generate de un singur părinte TObject, toate clasele de interfață sunt derivate de la strămoșul comun al TInterfacedObject. Acest strămoș poate aloca memorie pentru obiectele de interfață și utilizează interfața globală lunknow:
Dacă în exemplul anterior clasa TPainter a fost descrisă după cum urmează:
compilatorul va cere să descrieți metodele lipsă Queryinterface, _Add și _Release din clasa TInterfacedObject. Fref Count domeniu al acestei clase este obiectul de interfață de apel contra și utilizează acceptate în schema pentru Windows: de fiecare dată când metoda de interfață Add IUnknow contor este incrementat cu unul de fiecare dată de lansare - unitate este resetat. Când valoarea acestui câmp devine 0, obiectul interfeței este distrus și memoria sa este eliberată.
Dacă interfața este destinată utilizării în tehnologiile COM / DCOM sau CORBA, metodele acesteia ar trebui să descrie cu directiva stdcall sau (pentru obiectele Automation) safecall
Pentru obiectul interfeței, puteți utiliza operatorul de distribuție ca să utilizați interfața necesară:
Dacă ați întâlnit o astfel de alocare, compilatorul va crea un cod care apelează metoda Queryinterface a interfeței IUnknow cu cerința de a returna o referință la interfața IPaint. Dacă obiectul nu acceptă interfața specificată, apare o excepție.
Interfețele concepute pentru a fi folosite în obiecte la distanță trebuie să fie prevăzute cu un identificator global unic (guiD). De exemplu:
Identificatorii globali unici sunt creați folosind o tehnologie specială care garantează o probabilitate nesemnificativă mică de a coincide cu cei doi guidi. Această tehnologie este inclusă în Windows 32: pentru a obține guidul pentru interfața nou creată în mediul Delphi, trebuie doar să apăsați tastele Ctrl + Shift + G. Pentru a lucra cu guid în modulul System, sunt declarate următoarele tipuri:
Un programator poate declara constante tastate de tip tguid, de exemplu:
Constantele de ghidare pot fi folosite în locul numelor de interfață atunci când sunați subrutine. De exemplu, următoarele două referințe sunt identice:
Cu ajutorul cuvântului rezervat implementează, programatorul poate delega o anumită proprietate a unei clase autorității interfeței. Această proprietate trebuie să aibă tipul de interfață sau de clasă. Dacă proprietatea are un tip de interfață, numele acestei interfețe trebuie specificat în lista clasei părinte, ca și cum ar fi fost o clasă de interfață:
Notă: în acest exemplu, clasa TMyciass nu este o clasă de interfață, adică clasa în care sunt executate metodele p1 și p2. Cu toate acestea, dacă eliminați definiția proprietății autorizate a Mylnterface din ea, aceasta devine o proprietate interfață, iar metodele de interfață IMylnterface ar trebui să fie descrise în ea.
Proprietatea autorizată trebuie să aibă o parte citită. Dacă are un tip de clasă, clasa în care este declarată nu poate avea alte proprietăți autorizate.