Definiranje i implementacija sučelja u Delphiju

U Delphi, "sučelje" ima dva različita značenja. U OOP žargone, sučelje možete razmišljati kao klasu bez implementacije. U odjeljku sučelja definiranja jedinice Delphi koristi se za proglašavanje javnih dijelova koda koji se pojavljuju u jedinici. Ovaj članak će objasniti sučelja iz OOP perspektive.

Ako planirate stvoriti čvrstu aplikaciju na način da je vaš kôd održiv, ponovo upotrijebljiv i fleksibilan, OOP priroda Delphija pomoći će vam da vozite prvih 70% svoje rute. Definiranje sučelja i njihova implementacija pomoći će s preostalih 30%.

Sažetak nastave

O sučelju možete razmišljati kao o apstraktnoj klasi sa isključenom izvedbom i uklanjanjem svega što nije javno. Apstraktni razred u Delphi je klasa koja se ne može instancirati - ne možete stvoriti objekt iz klase koja je označena kao apstraktna.

Pogledajmo primjer deklaracije sučelja:

tip
IConfigChanged = sučelje[ '{0D57624C-CDDE-458b-A36C-436AE465B477}']
postupak ApplyConfigChange;
kraj;

IConfigChanged je sučelje. Sučelje je definirano slično kao klasa, umjesto ključne klase koristi se ključna riječ "sučelje". Vrijednost Guid koja prati ključnu riječ sučelja prevoditelj koristi za jedinstvenu identifikaciju sučelja. Da biste generirali novu vrijednost GUID-a, samo pritisnite Ctrl + Shift + G u Delphi IDE. Svako sučelje koje definirate treba jedinstvenu vrijednost Guida.

instagram viewer

Sučelje u OOP-u definira apstrakciju - predložak stvarne klase koja će implementirati sučelje - koja će implementirati metode definirane sučeljem. Sučelje zapravo ne radi ništa, samo ima potpis za interakciju s drugim (provedbenim) klasama ili sučeljima.

Implementacija metoda (funkcije, postupci i svojstva Get / Set metoda) vrši se u klasi koja implementira sučelje. U definiciji sučelja ne postoje odjeljci s opsegom (privatni, javni, objavljeni itd.), Sve je javno. Vrsta sučelja može definirati funkcije, postupke (koji će s vremenom postati metode klase koja implementira sučelje) i svojstva. Kada sučelje definira svojstvo, ono mora definirati metode get / set metode - sučelja ne mogu definirati varijable.

Kao i kod klasa, sučelje može naslijediti s drugih sučelja.

tip
IConfigChangedMore = sučelje(IConfigChanged)
postupak ApplyMoreChanges;
kraj;

Programiranje

Većina programera Delphi kada razmišljaju o sučeljima, misle na COM programiranje. Međutim, sučelja su samo OOP značajka jezika - nisu posebno vezana za COM. Sučelja se mogu definirati i implementirati u Delphi aplikaciji, a da se uopće ne dotaknu COM.

izvršenje

Da biste implementirali sučelje, trebate dodati naziv sučelja u izjavu klase, kao u:

tip
TMainForm = klasa(TForm, IConfigChanged)
javnost
postupak ApplyConfigChange;
kraj;

U gornjem kodu Delphi obrazac pod nazivom "MainForm" implementira IConfigChanged sučelje.

Upozorenje: kad klasa implementira sučelje, ona mora implementirati sve svoje metode i svojstva. Ako ne uspijete / zaboravite implementirati metodu (na primjer: ApplyConfigChange), pogreška u vremenu sastavljanja "E2003 nepriznati identifikator: 'ApplyConfigChange'" dogodit će se.
Upozorenje: ako pokušate navesti sučelje bez GUID vrijednosti koju ćete dobiti: "E2086 Tip" IConfigChanged "još nije u potpunosti definiran".

Primjer

Razmislite o MDI aplikaciji u kojoj se korisniku može istovremeno prikazati više obrazaca. Kada korisnik promijeni konfiguraciju aplikacije, većina obrazaca mora ažurirati svoj prikaz - pokazati / sakriti neke gumbe, ažurirati titlove naljepnica itd. Trebate jednostavan način da obavijestite sve otvorene obrasce da se dogodila promjena u konfiguraciji aplikacije. Idealno sredstvo za posao bilo je sučelje.

Svaki obrazac koji se mora ažurirati kad se promjene konfiguracije implementiraju IConfigChanged. Budući da je zaslon konfiguracije prikazan modalno, kad se zatvori sljedeći kôd, osigurava se da su svi IConfigChanged implementacijski obrasci obaviješteni i da se poziva ApplyConfigChange:

postupak DoConfigChange ();
var
cnt: cijeli broj;
icc: IConfigChanged;
početi
za cnt: = 0 do -1 + ekran. FormCount čini
početi
ako Podržava (ekran. Obrasci [cnt], IConfigChanged, icc) zatim
ICC. ApplyConfigChange;
kraj;
kraj;

Podrška funkcija (definirano u Sysutils.pas) označava podržava li određeni objekt ili sučelje određeno sučelje. Kôd ponavlja preko zaslona. Zbirka obrazaca (od TScreen objekta) - svi oblici trenutno prikazani u aplikaciji. Ako obrazac Zaslon. Oblici [CNT] podržava sučelje, Supports vraća sučelje za posljednji parametar parametra i vraća true.

Stoga, ako obrazac implementira IConfigChanged, icc varijabla može se upotrijebiti za pozivanje metoda sučelja kako ih obrazac provodi. Napominjemo, naravno da svaki oblik može imati vlastitu različitu provedbu postupka ApplyConfigChange.

preci

Svaka klasa koju definirate u Delphiju mora imati pretka. TObject je krajnji predak svih objekata i komponenata. Gornja ideja odnosi se i na sučelja, IInterface je osnovna klasa za sva sučelja. IInterface definira 3 metode: QueryInterface, _AddRef i _Release.

To znači da naš IConfigChanged također ima te 3 metode, ali ih mi nismo implementirali. To je zato što TForm nasljeđuje od TComponenta koji već implementira IInterface za vas! Kada želite implementirati sučelje u klasu koja nasljeđuje od TObject, provjerite je li vaša klasa naslijedila od TInterfacedObject. Budući da je TInterfacedObject TObject koji implementira IInterface. Na primjer:

TMyClass = klasa(TInterfacedObject, IConfigChanged)
postupak ApplyConfigChange;
kraj;

Zaključno, IUnknown = IInterface. Nepoznato je za COM.