V Delphi, "vmesnik" ima dva različna pomena. V OOP žargon, lahko o vmesniku razmišljate kot o razredu brez izvedbe. V razdelku Vmesnik za določanje enote Delphi se uporablja za razglasitev vseh javnih odsekov kode, ki se pojavijo v enoti. Ta članek bo razložil vmesnike z vidika OOP.
Če želite ustvariti zanesljivo aplikacijo na način, da je koda vzdržna, večkratna in prilagodljiva, OOP Narava Delphija vam bo pomagala pri vožnji prvih 70% poti. Določitev vmesnikov in njihovo izvajanje bo pomagalo pri preostalih 30%.
Izvleček
Vmesnik si lahko predstavljate kot abstraktni razred z odstranjeno izvedbo in vse, kar ni javno. Abstraktni razred v Delphi je razred, ki ga ni mogoče instancirati - predmeta ne morete ustvariti iz razreda, označenega kot abstraktni.
Oglejmo si primer izjave vmesnika:
tip
IConfigChanged = vmesnik['{0D57624C-CDDE-458B-A36C-436AE465B477}']
postopek UporabiConfigChange;
konec;
The IConfigChanged je vmesnik. Vmesnik je opredeljen podobno kot razred, namesto "razred" se uporablja ključna beseda "vmesnik". Vrednost Guid, ki sledi ključni besedi vmesnika, prevajalnik uporabi za enolično identifikacijo vmesnika. Če želite ustvariti novo vrednost GUID, samo pritisnite Ctrl + Shift + G v IDE Delphi. Vsak vmesnik, ki ga definirate, potrebuje edinstveno vrednost Guid.
Vmesnik v OOP definira abstrakcijo - predlogo dejanskega razreda, ki bo vmesnik implementiral - ki bo izvajal metode, ki jih je definiral vmesnik. Vmesnik dejansko ne naredi ničesar, ima samo podpis za interakcijo z drugimi (izvedbenimi) razredi ali vmesniki.
Izvedba metod (funkcije, postopki in lastnosti Get / Set lastnosti) se izvede v razredu, ki izvaja vmesnik. V definiciji vmesnika ni razdelkov o obsegu (zasebni, javni, objavljeni itd.), Vse je javno. Vrsta vmesnika lahko določa funkcije, postopke (ki bodo sčasoma postali metode razreda, ki izvaja vmesnik) in lastnosti. Ko vmesnik definira lastnost, mora definirati metode get / set - vmesniki ne morejo definirati spremenljivk.
Tako kot pri razredih lahko tudi vmesnik podeduje od drugih vmesnikov.
tip
IConfigChangedMore = vmesnik(IConfigChanged)
postopek Uporabi več sprememb;
konec;
Programiranje
Večina razvijalcev Delphijev, ko razmišljajo o vmesnikih, mislijo na COM programiranje. Vendar pa so vmesniki le jeziki OOP - niso posebej vezani na COM. Vmesnike je mogoče določiti in implementirati v aplikaciji Delphi, ne da bi se sploh dotaknili COM.
Izvajanje
Če želite implementirati vmesnik, morate vmesniku dodati ime vmesnika kot v:
tip
TMainForm = razred(TForm, IConfigChanged)
javnosti
postopek UporabiConfigChange;
konec;
V zgornji kodi obrazec Delphi z imenom "MainForm" izvaja vmesnik IConfigChanged.
Opozorilo: kadar razred izvaja vmesnik, mora izvajati vse svoje metode in lastnosti. Če ne boste / pozabili uporabiti metode (na primer: ApplyConfigChange), je napaka v času prevajanja "E2003 Neopredeljeni identifikator: 'ApplyConfigChange'" se bo zgodilo.
Opozorilo: če poskusite določiti vmesnik brez vrednosti GUID, boste prejeli: "E2086 Tip" IConfigChanged "še ni popolnoma definiran.".
Primer
Razmislite o aplikaciji MDI, kjer je uporabniku lahko hkrati prikazano več obrazcev. Ko uporabnik spremeni konfiguracijo aplikacije, mora večina obrazcev posodobiti zaslon - pokazati / skriti nekatere gumbe, posodobiti napise nalepk itd. Potrebovali boste preprost način, da vse odprte obrazce obvestite, da se je v konfiguraciji aplikacije zgodila sprememba. Idealno orodje za delo je bil vmesnik.
Vsak obrazec, ki ga je treba posodobiti, ko bodo spremembe konfiguracije uvedle IConfigChanged. Ker je konfiguracijski zaslon prikazan modalno, ko zapre naslednjo kodo, se zagotovi, da so vsi IConfigChanged izvedbeni obrazci obveščeni in se imenuje ApplyConfigChange:
postopek DoConfigChange ();
var
cnt: celo število;
icc: IConfigChanged;
začeti
za cnt: = 0 do -1 + Zaslon. FormCount stori
začeti
če Podpira (Zaslon. Obrazci [cnt], IConfigChanged, icc) torej
icc. UporabiConfigChange;
konec;
konec;
Podpora funkcijo (definirano v Sysutils.pas) označuje, ali določen predmet ali vmesnik podpira določen vmesnik. Koda ponavlja skozi zaslon. Zbirka obrazcev (objekta TScreen) - vsi obrazci, ki so trenutno prikazani v aplikaciji. Če obrazec Zaslon. Obrazci [cnt] podpira vmesnik, Supports vrne vmesnik za zadnji parameter parametra in vrne true.
Torej, če obrazec izvaja IConfigChanged, lahko spremenljivko icc uporabimo za klicanje metod vmesnika, kot jih izvaja obrazec. Seveda upoštevajte, da lahko vsaka oblika drugačno izvajanje postopka ApplyConfigChange.
Predniki
Vsak razred, ki ga definirate v Delphiju, mora imeti prednika. TObject je končni prednik vseh predmetov in komponent. Zgornja ideja velja tudi za vmesnike, IInterface je osnovni razred za vse vmesnike. IInterface definira 3 metode: QueryInterface, _AddRef in _Release.
To pomeni, da ima naš IConfigChanged tudi tiste 3 metode, ki pa jih nismo izvajali. To je zato, ker TForm podeduje od TComponent, ki že izvaja IInterface za vas! Ko želite vmesnik vpeljati v razred, ki podeduje od TObject, se prepričajte, da vaš razred deduje od TInterfacedObject. Ker je TInterfacedObject TObject, ki izvaja IInterface. Na primer:
TMyClass = razred(TInterfacedObject, IConfigChanged)
postopek UporabiConfigChange;
konec;
Za zaključek IUnknown = IInterface. Neznano je za COM.