Sisään Delfoi, "käyttöliittymällä" on kaksi erillistä merkitystä. Sisään OOP žargon, voit ajatella käyttöliittymää luokana, jolla ei ole toteutusta. Delphin yksikkömääritysrajapintaosaa käytetään ilmoittamaan kaikki yksikössä näkyvät koodiosat. Tämä artikkeli selittää rajapinnat OOP-näkökulmasta.
Jos olet luomassa vankkaa sovellusta tavalla, että koodisi on ylläpidettävä, uudelleenkäytettävä ja joustava, OOP Delphin luonto auttaa sinua ajamaan ensimmäiset 70% reitistäsi. Rajapintojen määritteleminen ja toteuttaminen auttavat jäljellä olevissa 30%: ssa.
Abstraktit luokat
Voit ajatella käyttöliittymää abstraktina luokana, jossa kaikki toteutukset on poistettu ja kaikki, mikä ei ole julkista, poistetaan. Abstrakti luokka Delfoi on luokka, jota ei voida välittää - et voi luoda objektia luokasta, joka on merkitty abstraktiksi.
Katsotaanpa esimerkkiä käyttöliittymäilmoituksesta:
tyyppi
IConfigChanged = käyttöliittymä[{0D57624C-CDDE-458B-A36C-436AE465B477}]
menettely ApplyConfigChange;
pää;
IConfigChanged
on käyttöliittymä. Rajapinta määritellään paljon kuin luokka. Avainsanaa "käyttöliittymä" käytetään luokan "sijasta". Kääntäjä käyttää käyttöliittymän avainsanaa seuraavaa Guid-arvoa rajapinnan yksilöimiseen. Luo uusi GUID-arvo painamalla vain Ctrl + Shift + G Delphi IDE: ssä. Jokainen määrittämäsi käyttöliittymä tarvitsee yksilöivän Guid-arvon.OOP: n rajapinta määrittelee abstraktion - mallin todelliselle luokalle, joka toteuttaa rajapinnan -, joka toteuttaa rajapinnan määrittelemät menetelmät. Rajapinta ei todellakaan tee mitään, sillä on vain allekirjoitus vuorovaikutukseen muiden (toteuttavien) luokkien tai rajapintojen kanssa.
Menetelmien (toiminnot, proseduurit ja ominaisuudet Get / Set-menetelmät) toteutus tapahtuu luokassa, joka toteuttaa rajapinnan. Rajapintamääritelmässä ei ole laajuusosioita (yksityinen, julkinen, julkaistu jne.), Kaikki on julkista. Rajapintatyyppi voi määritellä toiminnot, proseduurit (joista tulee lopulta luokan menetelmiä, jotka toteuttavat rajapinnan) ja ominaisuudet. Kun rajapinta määrittelee ominaisuuden, sen on määriteltävä get / set-menetelmät - rajapinnat eivät voi määritellä muuttujia.
Kuten luokissakin, käyttöliittymä voi periä muista rajapinnoista.
tyyppi
IConfigChangedMore = käyttöliittymä(IConfigChanged)
menettely ApplyMoreChanges;
pää;
Ohjelmointi
Suurin osa Delphin kehittäjistä ajatellessaan rajapintoja he ajattelevat COM-ohjelmoinnista. Rajapinnat ovat kuitenkin vain kielen OOP-ominaisuus - niitä ei ole sidottu erityisesti COM: ään. Rajapinnat voidaan määritellä ja toteuttaa Delphi-sovelluksessa koskematta lainkaan COM: ta.
Toteutus
Käyttöliittymän toteuttamiseksi sinun on lisättävä käyttöliittymän nimi luokan käskyyn, kuten:
tyyppi
TMainForm = luokka(TForm, IConfigChanged)
julkinen
menettely ApplyConfigChange;
pää;
Yllä olevassa koodissa Delphi-muoto, nimeltään "MainForm", toteuttaa IConfigChanged-liittymän.
Varoitus: kun luokka toteuttaa rajapinnan, sen on toteutettava kaikki menetelmänsä ja ominaisuutensa. Jos epäonnistut / unohdat ottaa käyttöön menetelmän (esimerkiksi: ApplyConfigChange), käännä aikavirhe "E2003 ilmoittamaton tunniste: 'ApplyConfigChange'" tapahtuu.
Varoitus: Jos yrität määritellä käyttöliittymää ilman vastaanotettavaa GUID-arvoa: "E2086-tyyppiä 'IConfigChanged' ei ole vielä määritelty täysin".
esimerkki
Harkitse MDI-sovellusta, jossa useita lomakkeita voidaan näyttää käyttäjälle kerralla. Kun käyttäjä muuttaa sovelluksen kokoonpanoa, useimpien lomakkeiden on päivitettävä näyttönsä - näytettävä / piilotettava joitain painikkeita, päivitettävä otsikkotekstit jne. Tarvitset yksinkertaisen tavan ilmoittaa kaikille avoimille lomakkeille, että sovelluksen kokoonpanossa on tapahtunut muutos. Ihanteellinen työkalu työhön oli käyttöliittymä.
Jokainen lomake, joka on päivitettävä, kun kokoonpanomuutokset otetaan käyttöön IConfigChanged. Koska kokoonpanonäyttö näytetään modaalisesti, seuraavan koodin sulkemisen jälkeen varmistetaan, että kaikille IConfigChanged-toteutusmuodoille ilmoitetaan ja ApplyConfigChange -sovellusta kutsutaan:
menettely DoConfigChange ();
var
cnt: kokonaisluku;
icc: IConfigChanged;
alkaa
varten cnt: = 0 että -1 + näyttö. FormCount tehdä
alkaa
jos Tuet (näyttö. Lomakkeet [cnt], IConfigChanged, ICC) sitten
ICC. ApplyConfigChange;
pää;
pää;
Tuet toimia (määritelty Sysutils.pas -sovelluksessa) ilmaisee, tukeeko jokin objekti tai rajapinta määritettyä rajapintaa. Koodi toistuu näytön läpi. Lomakkeiden kokoelma (TScreen-objektista) - kaikki sovelluksessa tällä hetkellä näkyvät lomakkeet. Jos lomake Näyttö. Muodot [cnt] tukee käyttöliittymää, Supports palauttaa viimeisen parametriparametrin rajapinnan ja palauttaa true.
Siksi, jos muoto toteuttaa IConfigChanged -sovelluksen, icc-muuttujaa voidaan käyttää kutsumaan muodon toteuttamia rajapinnan menetelmiä. Huomaa tietysti, että jokaisella lomakkeella voi olla oma erilainen ApplyConfigChange-menettelyn toteutus.
Esivanhemmat
Kaikilla Delphissä määrittelemillä luokilla on oltava esi-isä. TObject on kaikkien esineiden ja komponenttien perimmäinen esi-isä. Edellä esitetty ajatus koskee myös rajapintoja, IInterface on kaikkien rajapintojen perusluokka. IInterface määrittelee 3 menetelmää: QueryInterface, _AddRef ja _Release.
Tämä tarkoittaa, että IConfigChanged -sovelluksellamme on myös nämä 3 menetelmää, mutta emme ole ottaneet niitä käyttöön. Tämä johtuu siitä, että TForm perii TComponentilta, joka jo toteuttaa IInterface sinulle! Kun haluat toteuttaa käyttöliittymän luokassa, joka perii TObjectiltä, varmista, että luokka perii sen sijaan TInterfacedObjectilta. Koska TInterfacedObject on TObject, joka toteuttaa IInterface. Esimerkiksi:
TMyClass = luokka(TInterfacedObject, IConfigChanged)
menettely ApplyConfigChange;
pää;
Lopuksi, IUnknown = IInterface. IUnknown on tarkoitettu COM: lle.