Liideste määratlemine ja juurutamine Delphis

Sisse Delphi, "liidesel" on kaks eraldiseisvat tähendust. Sisse OOP kõnepruuki, võite mõelda liidesele kui klassile, millel pole rakendamist. Delphi üksuse määratluse liidese jaotist kasutatakse kõigi avalike koodilõikude deklareerimiseks, mis ühikus esinevad. See artikkel selgitab liideseid OOP vaatenurgast.

Kui soovite luua kindla rakenduse viisil, et teie kood on hooldatav, korduvkasutatav ja paindlik, OOP Delphi loodus aitab teil sõita marsruudi esimesed 70%. Liideste määratlemine ja nende rakendamine aitab järelejäänud 30%.

Abstraktsed klassid

Võite mõelda liidesele kui abstraktsele klassile, millelt eemaldatakse kogu rakendamine ja eemaldatakse kõik, mis pole avalik. Abstraktne klass Delphi on klass, mida ei saa realiseerida - te ei saa objekti luua abstraktseks tähistatud klassist.

Vaatame näiteks liidese deklaratsiooni:

tüüp
IConfigChanged = liides['{0D57624C-CDDE-458B-A36C-436AE465B477}']
protseduur ApplyConfigChange;
lõpp;

IConfigChanged on liides. Liides määratletakse sarnaselt klassile, klassi "asemel" kasutatakse märksõna "liides". Liidese märksõnale järgnevat Guidi väärtust kasutab kompilaator liidese ainulaadseks tuvastamiseks. Uue GUID-i väärtuse genereerimiseks vajutage lihtsalt Delphi IDE-s Ctrl + Shift + G. Iga teie määratletud liides vajab ainulaadset Guidi väärtust.

instagram viewer

OOP-i liides määratleb abstraktsiooni - liidese rakendava tegeliku klassi malli -, mis rakendab liidese määratletud meetodeid. Liides ei tee tegelikult midagi, sellel on vaid allkiri teiste (rakendus) klasside või liidestega suhtlemiseks.

Meetodite (funktsioonid, protseduurid ja atribuudid Get / Set meetodid) juurutamine toimub liideses rakendavas klassis. Liidese määratluses puuduvad ulatuse jaotised (privaatne, avalik, avaldatud jne), kõik on avalik. Liidese tüüp võib määratleda funktsioonid, protseduurid (millest saavad lõpuks liidese rakendava klassi meetodid) ja omadused. Kui liides määratleb atribuudi, peab see määratlema get / set meetodid - liidesed ei saa muutujaid määratleda.

Nagu klasside puhul, võib liides pärida ka teistelt liidestelt.

tüüp
IConfigChangedMore = liides(IConfigChanged)
protseduur ApplyMoreChanges;
lõpp;

Programmeerimine

Enamik Delphi arendajaid, kui mõelda liidestele, mida nad mõtlevad COM-i programmeerimisest. Liidesed on aga vaid keele optilise funktsiooni tunnusjoon - neid ei seota konkreetselt COM-iga. Liideseid saab määratleda ja rakendada Delphi rakenduses ilma COM-i üldse puudutamata.

Rakendamine

Liidese rakendamiseks peate klassi avaldusele lisama liidese nime, nagu näiteks:

tüüp
TMainForm = klass(TForm, muudetud ICon)
avalik
protseduur ApplyConfigChange;
lõpp;

Ülaltoodud koodis rakendab Delphi vorm nimega "MainForm" IConfigChanged liidese.

Hoiatus: kui klass rakendab liidest, peab ta rakendama kõik selle meetodid ja omadused. Kui teil ei õnnestu / unustate mõnda meetodit rakendada (näiteks: ApplyConfigChange), siis kompileerige ajaviga "E2003 deklareerimata identifikaator: 'ApplyConfigChange'" toimub.
Hoiatus: kui proovite liidest täpsustada ilma saadava GUID-i väärtuseta: "E2086 tüüp 'IConfigChanged' pole veel täielikult määratletud".

Näide

Mõelge MDI-rakendusele, kus kasutajale saab korraga kuvada mitu vormi. Kui kasutaja muudab rakenduse konfiguratsiooni, peab enamik vorme oma kuva värskendama - mõne nupu kuvamiseks / peitmiseks, siltide pealdiste värskendamiseks jne. Teil oleks vaja lihtsat viisi, kuidas teavitada kõiki avatud vorme rakenduse konfiguratsiooni muutumisest. Ideaalne töövahend oli liides.

Iga vorm, mida tuleb konfiguratsioonimuudatuste korral värskendada, rakendab IConfigChanged. Kuna konfiguratsiooniekraan kuvatakse modaalselt, tagab järgmine kood selle sulgemise korral kõik IConfigChanged rakendusvormid teatamise ja ApplyConfigChange kutsumise:

protseduur DoConfigChange ();
var
cnt: täisarv;
icc: IConfigChanged;
alustada
jaoks cnt: = 0 kuni -1 + ekraan. FormCount teha
alustada
kui Toetab (ekraan. Vormid [cnt], IConfigChanged, icc) siis
icc. ApplyConfigChange;
lõpp;
lõpp;

Toed funktsiooni (määratletud süsteemis Sysutils.pas) näitab, kas antud objekt või liides toetab määratletud liidest. Kood itreerub läbi ekraani. Vormide kogumine (objektiga TScreen) - kõik rakenduses praegu kuvatavad vormid. Kui vorm Ekraan. Vormid [cnt] toetab liidest, Supports tagastab liidese viimase parameetri parameetri jaoks ja tagastab tõese.

Seega, kui vorm rakendab rakendust IConfigChanged, saab ICC muutujat kasutada vormi poolt rakendatud liidese meetodite kutsumiseks. Muidugi pange tähele, et igal vormil võib olla protseduuri ApplyConfigChange enda erinev rakendamine.

Esivanemad

Igal klassil, mille Delphis määratlete, peab olema esivanem. TObject on kõigi objektide ja komponentide ülim esivanem. Ülaltoodud idee kehtib ka liideste kohta, IInterface on kõigi liideste põhiklass. IInterface määratleb 3 meetodit: QueryInterface, _AddRef ja _Release.

See tähendab, et ka meie IConfigChangedis on need 3 meetodit, kuid me pole neid rakendanud. Selle põhjuseks on asjaolu, et TForm pärib ettevõttelt TComponent, mis juba rakendab teile IInterfacei! Kui soovite rakendada liidest klassis, mis pärib TObjectilt, veenduge, et teie klass pärib selle asemel TInterfacedObject. Kuna TInterfacedObject on IInterfacei rakendus TObject. Näiteks:

TMyClass = klass(TInfacedObject, IConfigChanged)
protseduur ApplyConfigChange;
lõpp;

Kokkuvõtteks: IUnknown = IInterface. IUnknown on mõeldud COM-i jaoks.

instagram story viewer