Definition og implementering af grænseflader i Delphi

I Delphi, "interface" har to forskellige betydninger. I OOP jargon, kan du tænke på en grænseflade som en klasse uden implementering. I Delphi-enhedsdefinitionsgrænsefladeafsnit bruges til at erklære alle offentlige sektioner af kode, der vises i en enhed. Denne artikel forklarer grænseflader fra et OOP-perspektiv.

Hvis du vil oprette en bundsolid applikation på en sådan måde, at din kode er vedligeholdelig, genanvendelig og fleksibel OOP natur af Delphi vil hjælpe dig med at køre de første 70% af din rute. Definition af grænseflader og implementering af dem vil hjælpe med de resterende 30%.

Abstrakte klasser

Du kan tænke på en grænseflade som en abstrakt klasse med al implementeringen fjernet og alt, hvad der ikke er offentligt fjernet. En abstrakt klasse i Delphi er en klasse, der ikke kan instantieres - du kan ikke oprette et objekt fra en klasse markeret som abstrakt.

Lad os se på et eksempel på en grænsefladedeklaration:

type
IConfigChanged = grænseflade[ '{0D57624C-CDDE-458B-A36C-436AE465B477}']
procedure ApplyConfigChange;
ende;
instagram viewer

Det IConfigChanged er en grænseflade. En grænseflade defineres meget som en klasse, nøgleordet "interface" bruges i stedet for "klasse". Vejledningsværdien, der følger interface-nøgleordet, bruges af compileren til unikt at identificere grænsefladen. For at generere en ny GUID-værdi skal du bare trykke på Ctrl + Shift + G i Delphi IDE. Hver grænseflade, du definerer, har brug for en unik vejledende værdi.

En grænseflade i OOP definerer en abstraktion - en skabelon til en faktisk klasse, der vil implementere grænsefladen - der vil implementere de metoder, der er defineret af grænsefladen. En grænseflade gør faktisk ikke noget, den har kun en signatur til interaktion med andre (implementerende) klasser eller grænseflader.

Implementeringen af ​​metoderne (funktioner, procedurer og egenskaber Get / Set-metoder) foregår i den klasse, der implementerer grænsefladen. I grænsefladedefinitionen er der ingen omfangssektioner (privat, offentlig, offentliggjort osv.) Alt er offentligt. En grænsefladetype kan definere funktioner, procedurer (der til sidst bliver metoder til den klasse, der implementerer grænsefladen) og egenskaber. Når en grænseflade definerer en egenskab, skal den definere get / set-metoder - grænseflader kan ikke definere variabler.

Som med klasser kan en grænseflade arve fra andre grænseflader.

type
IConfigChangedMore = grænseflade(IConfigChanged)
procedure ApplyMoreChanges;
ende;

Programmering

De fleste Delphi-udviklere, når de tænker på grænseflader, de tænker på COM-programmering. Grænseflader er imidlertid bare en OOP-funktion på sproget - de er ikke bundet specifikt til COM. Grænseflader kan defineres og implementeres i en Delphi-applikation uden overhovedet at berøre COM.

Implementering

For at implementere en grænseflade skal du tilføje navnet på grænsefladen til klassesedlen som i:

type
TMainForm = klasse(TForm, IConfigChanged)
offentlig
procedure ApplyConfigChange;
ende;

I ovenstående kode implementerer en Delphi-form ved navn "MainForm" det IConfigChanged-interface.

Advarsel: Når en klasse implementerer en grænseflade, skal den implementere alle dens metoder og egenskaber. Hvis du ikke glemmer / glemmer at implementere en metode (for eksempel: ApplyConfigChange), er der en kompileringstidsfejl "E2003 Uklareret identifikator: 'ApplyConfigChange'" vil forekomme.
Advarsel: hvis du prøver at specificere grænsefladen uden den GUID-værdi, du vil modtage: "E2086 Type 'IConfigChanged' er endnu ikke fuldstændigt defineret".

Eksempel

Overvej en MDI-applikation, hvor flere former kan vises for brugeren på én gang. Når brugeren ændrer applikationskonfigurationen, er de fleste formularer nødt til at opdatere deres display - vise / skjule nogle knapper, opdatere billedtekst osv. Du har brug for en enkel måde for at underrette alle åbne formularer om, at der er sket en ændring i applikationskonfigurationen. Det ideelle værktøj til jobbet var en grænseflade.

Hver form, der skal opdateres, når konfigurationsændringerne implementerer IConfigChanged. Da konfigurationsskærmen vises modalt, når den lukker den næste kode, sikrer du, at alle IConfigChanged-implementeringsformularer bliver underrettet, og ApplyConfigChange kaldes:

procedure DoConfigChange ();
Var
cnt: heltal;
icc: IConfigChanged;
begynde
til cnt: = 0 til -1 + skærm. FormCount gøre
begynde
hvis Understøtter (skærm. Formularer [cnt], IConfigChanged, icc) derefter
ICC. ApplyConfigChange;
ende;
ende;

Understøtter fungere (defineret i Sysutils.pas) angiver, om et givet objekt eller interface understøtter en specificeret grænseflade. Koden gentages gennem skærmen. Formularsamling (af TScreen-objektet) - alle de formularer, der aktuelt vises i applikationen. Hvis en formular Screen. Former [cnt] understøtter grænsefladen, Support understøtter grænsefladen for den sidste parameterparameter og returnerer sand.

Derfor, hvis formen implementerer IConfigChanged, kan icc-variablen bruges til at kalde grænsefladens metoder som implementeret af formularen. Bemærk naturligvis, at enhver form kan have sin egen forskellige implementering af ApplyConfigChange-proceduren.

Aner

Enhver klasse, du definerer i Delphi, skal have en stamfar. TObject er den ultimative stamfar til alle objekter og komponenter. Ovenstående idé gælder også for grænseflader, IInterface er baseklassen for alle grænseflader. IInterface definerer 3 metoder: QueryInterface, _AddRef og _Release.

Dette betyder, at vores IConfigChanged også har disse 3 metoder, men vi har ikke implementeret dem. Dette er fordi TForm arver fra TComponent, der allerede implementerer IInterface til dig! Når du vil implementere en grænseflade i en klasse, der arver fra TObject, skal du sørge for, at din klasse arver fra TInterfacedObject i stedet. Da TInterfacedObject er et TObject, der implementerer IInterface. For eksempel:

TMyClass = klasse(TInterfacedObject, IConfigChanged)
procedure ApplyConfigChange;
ende;

Afslutningsvis er IUnbekendt = IInterface. IUnbekendt er til COM.

instagram story viewer