Definirea și implementarea interfețelor în Delphi

În Delphi, „interfață” are două semnificații distincte. În OOP jargon, vă puteți gândi la o interfață ca o clasă fără implementare. În Delphi, secțiunea de interfață de definire a unității este utilizată pentru a declara orice secțiuni publice de cod care apar într-o unitate. Acest articol va explica interfețele dintr-o perspectivă OOP.

Dacă doriți să creați o aplicație solidă într-un mod în care codul dvs. să poată fi menținut, reutilizabil și flexibil OOP natura Delphi vă va ajuta să conduceți primele 70% din traseu. Definirea interfețelor și implementarea acestora va ajuta cu restul de 30%.

Clasele abstracte

Vă puteți gândi la o interfață ca la o clasă abstractă, cu toată implementarea eliminată și tot ceea ce nu este public eliminat. O clasă abstractă în Delphi este o clasă care nu poate fi inițiată - nu puteți crea un obiect dintr-o clasă marcată drept abstract.

Să aruncăm o privire la o declarație de interfață de exemplu:

tip
IConfigChanged = interfață[ '{0D57624C-CDDE-458b-A36C-436AE465B477}']
procedură ApplyConfigChange;
Sfârșit;
instagram viewer

IConfigChanged este o interfață. O interfață este definită la fel ca o clasă, cuvântul cheie „interfață” este folosit în loc de „clasă”. Valoarea Ghid care urmează cuvântul cheie de interfață este utilizată de compilator pentru a identifica în mod unic interfața. Pentru a genera o nouă valoare GUID, trebuie doar să apăsați Ctrl + Shift + G în Delphi IDE. Fiecare interfață pe care o definiți are nevoie de o valoare Ghid unică.

O interfață din OOP definește o abstractizare - un șablon pentru o clasă reală care va implementa interfața - care va implementa metodele definite de interfață. O interfață nu face nimic, ci are o semnătură pentru interacțiunea cu alte clase sau interfețe (de implementare).

Implementarea metodelor (funcții, proceduri și metode Get / Set de proprietate) se face în clasa care implementează interfața. În definiția interfeței, nu există secțiuni de aplicare (private, publice, publicate etc.) totul este public. Un tip de interfață poate defini funcții, proceduri (care vor deveni în cele din urmă metode ale clasei care implementează interfața) și proprietăți. Când o interfață definește o proprietate trebuie să definească metodele get / set - interfețele nu pot defini variabile.

Ca și în clase, o interfață poate moșteni de la alte interfețe.

tip
IConfigChangedMore = interfață(IConfigChanged)
procedură ApplyMoreChanges;
Sfârșit;

Programare

Majoritatea dezvoltatorilor Delphi când se gândesc la interfețe se gândesc la programarea COM. Cu toate acestea, interfețele sunt doar o caracteristică OOP a limbii - nu sunt legate în mod specific de COM. Interfețele pot fi definite și implementate într-o aplicație Delphi fără a atinge COM deloc.

Punerea în aplicare

Pentru a implementa o interfață trebuie să adăugați numele interfeței la instrucțiunea de clasă, ca în:

tip
TMainForm = clasă(TForm, IConfigChanged)
public
procedură ApplyConfigChange;
Sfârșit;

În codul de mai sus, un formular Delphi numit „MainForm” implementează interfața IConfigChanged.

Avertizare: când o clasă implementează o interfață trebuie să implementeze toate metodele și proprietățile sale. Dacă nu reușiți / uitați să implementați o metodă (de exemplu: ApplyConfigChange) o eroare de timp de compilare "Identificator nedeclarat E2003: 'ApplyConfigChange'" o să se întâmple.
Avertizare: dacă încercați să specificați interfața fără valoarea GUID, veți primi: "Tip E2086 'IConfigChanged' nu este încă complet definit".

Exemplu

Luați în considerare o aplicație MDI unde mai multe formulare pot fi afișate utilizatorului simultan. Când utilizatorul schimbă configurația aplicației, majoritatea formularelor trebuie să își actualizeze afișarea - afișarea / ascunderea unor butoane, actualizarea legendelor pentru etichete etc. Ați avea nevoie de o modalitate simplă de a notifica toate formularele deschise că s-a întâmplat o modificare în configurația aplicației. Instrumentul ideal pentru meserie a fost o interfață.

Fiecare formular care trebuie actualizat la modificarea configurației va implementa IConfigChanged. Deoarece ecranul de configurare este afișat modal, atunci când se închide următorul cod asigură că toate formularele de implementare IConfigChanged sunt notificate și ApplyConfigChange este numit:

procedură DoConfigChange ();
var
cnt: număr întreg;
icc: IConfigChanged;
începe
pentru cnt: = 0 la -1 + Ecran. FormCount do
începe
dacă Suportă (ecran. Formulare [cnt], IConfigChanged, icc) apoi
icc. ApplyConfigChange;
Sfârșit;
Sfârșit;

Suporturile funcţie (definit în Sysutils.pas) indică dacă un obiect sau o anumită interfață acceptă o interfață specificată. Codul iterează prin ecran. Colecția de formulare (a obiectului TScreen) - toate formularele afișate în prezent în aplicație. Dacă un formular Ecran. Formulare [cnt] acceptă interfața, Suport returnează interfața pentru ultimul parametru și returnează true.

Prin urmare, dacă formularul pune în aplicare IConfigChanged, variabila icc poate fi utilizată pentru a apela la metodele interfeței, așa cum sunt implementate de formular. Rețineți, desigur, că fiecare formă poate avea propria sa implementare diferită a procedurii ApplyConfigChange.

străbuni

Orice clasă pe care o definiți în Delphi trebuie să aibă un strămoș. TObject este strămoșul final al tuturor obiectelor și componentelor. Ideea de mai sus se aplică și interfețelor, IInterface este clasa de bază pentru toate interfețele. IInterface definește 3 metode: QueryInterface, _AddRef și _Release.

Acest lucru înseamnă că IConfigChanged are și cele 3 metode, dar nu le-am implementat. Acest lucru se datorează faptului că TForm moștenește de la TComponent care implementează deja IInterface pentru tine! Atunci când doriți să implementați o interfață dintr-o clasă care moștenește de la TObject, asigurați-vă că în schimb clasa dvs. moștenește de la TInterfacedObject. Deoarece TInterfacedObject este un TObject care implementează IInterface. De exemplu:

TMyClass = clasă(TInterfacedObject, IConfigChanged)
procedură ApplyConfigChange;
Sfârșit;

În concluzie, IUnknown = IInterface. IUnknown este pentru COM.

instagram story viewer