Iekšā Delfi, “interfeisam” ir divas atšķirīgas nozīmes. Iekšā OOP žargonā, jūs varat domāt par interfeisu kā klasi bez ieviešanas. Delfu vienības definīcijas saskarnes sadaļa tiek izmantota, lai deklarētu visas publiskās koda sadaļas, kas parādās vienībā. Šis raksts izskaidros saskarnes no OOP perspektīvas.
Ja jūs gatavojaties izveidot stabilu lietojumprogrammu tādā veidā, lai jūsu kods būtu uzturējams, atkārtoti lietojams un elastīgs, OOP Delfu daba palīdzēs jums nobraukt pirmos 70% no jūsu maršruta. Saskarņu definēšana un ieviešana palīdzēs atlikušajiem 30%.
Abstraktās klases
Jūs varat domāt par saskarni kā abstraktu klasi, kurā ir noņemta visa ieviešana un noņemts viss, kas nav publiski pieejams. Abstrakta klase Delfi ir klase, kuru nevar uzreiz realizēt - jūs nevarat izveidot objektu no klases, kas atzīmēta kā abstrakta.
Apskatīsim interfeisa deklarācijas paraugu:
tips
IConfigChanged = saskarne['{0D57624C-CDDE-458B-A36C-436AE465B477}']
procedūra ApplyConfigChange;
beigas;
IConfigMainīts ir interfeiss. Saskarne ir definēta līdzīgi klasei, klases vietā tiek izmantots atslēgvārds "interfeiss". Guid vērtību, kas seko saskarnes atslēgvārdam, kompilators izmanto, lai unikāli identificētu saskarni. Lai ģenerētu jaunu GUID vērtību, Delphi IDE vienkārši nospiediet Ctrl + Shift + G. Katrai jūsu definētajai saskarnei ir nepieciešama unikāla Guid vērtība.
OOP saskarne definē abstrakciju - faktiskās klases veidni, kas ieviesīs saskarni -, kas ieviesīs saskarnes definētās metodes. Saskarne faktiski neko nedara, tai ir tikai paraksts mijiedarbībai ar citām (ieviešanas) klasēm vai saskarnēm.
Metožu (funkciju, procedūru un īpašību iegūšanas / iestatīšanas metožu) ieviešana tiek veikta klasē, kas realizē saskarni. Saskarnes definīcijā nav jomas sadaļu (privāta, publiska, publicēta utt.), Viss ir publisks. Saskarnes tips var definēt funkcijas, procedūras (kas galu galā kļūs par klases metodēm, kuras ievieš saskarni) un īpašības. Kad saskarne definē īpašumu, tai jādefinē iegūšanas / iestatīšanas metodes - saskarnes nevar definēt mainīgos.
Tāpat kā klasēs, saskarni var mantot no citām saskarnēm.
tips
IConfigChangedMore = saskarne(IConfigMainīts)
procedūra ApplyMoreChanges;
beigas;
Programmēšana
Lielākā daļa Delphi izstrādātāju, domājot par saskarnēm, ko viņi domā par COM programmēšanu. Tomēr saskarnes ir tikai valodas OOP īpašība - tās nav īpaši saistītas ar COM. Saskarnes var definēt un ieviest Delphi lietojumprogrammā, vispār nepieskaroties COM.
Īstenošana
Lai ieviestu saskarni, klases pārskatā jāpievieno saskarnes nosaukums, kā norādīts:
tips
TMainForm = klase(TForm, IConfigMainīts)
publiski
procedūra ApplyConfigChange;
beigas;
Iepriekš minētajā kodā Delphi forma ar nosaukumu "MainForm" īsteno interfeisu IConfigChanged.
Brīdinājums: ja klase realizē saskarni, tai jāīsteno visas tās metodes un īpašības. Ja neizdodas / aizmirstat ieviest metodi (piemēram: ApplyConfigChange), sastādiet laika kļūdu "E2003 nedeklarēts identifikators: 'ApplyConfigChange'" notiks.
Brīdinājums: ja mēģināt norādīt saskarni bez saņemtās GUID vērtības: "E2086 tips 'IConfigChanged' vēl nav pilnībā definēts".
Piemērs
Apsveriet MDI lietojumprogrammu, kurā lietotājam vienlaikus var tikt parādītas vairākas veidlapas. Kad lietotājs maina lietojumprogrammas konfigurāciju, lielākajai daļai veidlapu ir nepieciešams atjaunināt displeju - parādīt / paslēpt dažas pogas, atjaunināt etiķešu parakstus utt. Jums būs nepieciešams vienkāršs veids, kā paziņot visām atvērtām formām, ka ir notikušas izmaiņas lietojumprogrammu konfigurācijā. Ideāls darba rīks bija interfeiss.
Ikviena forma, kas jāatjaunina, kad konfigurācijas izmaiņas ieviesīs IConfigChanged. Tā kā konfigurācijas ekrāns tiek parādīts modāli, aizverot nākamo kodu, tiek nodrošināts, ka tiek paziņotas visas IConfigChanged ieviešanas formas un tiek izsaukts ApplyConfigChange:
procedūra DoConfigChange ();
var
cnt: vesels skaitlis;
icc: IConfigMainīts;
sākt
priekš cnt: = 0 uz -1 + ekrāns. FormCount darīt
sākt
ja Atbalsts (Ekrāns. Veidlapas [cnt], IConfigChanged, ICC) tad
ICC. ApplyConfigChange;
beigas;
beigas;
Atbalsts funkcija (definēts Sysutils.pas) norāda, vai dotais objekts vai interfeiss atbalsta noteikto interfeisu. Kods atkārtojas caur ekrānu. Veidlapu kolekcija (no TScreen objekta) - visas veidlapas, kas pašlaik tiek parādītas lietojumprogrammā. Ja forma Ekrāns. Veidlapas [cnt] atbalsta interfeisu, Supports atgriež pēdējā parametra parametra saskarni un atgriežas patiesi.
Tāpēc, ja veidlapa ievieš IConfigChanged, ICC mainīgo var izmantot, lai izsauktu veidlapas ieviestās saskarnes metodes. Protams, ņemiet vērā, ka jebkura forma var būt pati sava atšķirīgā ApplyConfigChange procedūras ieviešana.
Senči
Jebkurai klasei, kuru jūs definējat Delfos, ir jābūt priekštecei. TObject ir visu priekšmetu un sastāvdaļu galvenais sencis. Iepriekš minētā ideja attiecas arī uz saskarnēm, IInterface ir visu saskarņu pamatklase. IInterface definē 3 metodes: QueryInterface, _AddRef un _Release.
Tas nozīmē, ka mūsu IConfigChanged ir arī šīs 3 metodes, taču mēs tās neesam ieviesuši. Tas ir tāpēc, ka TForm manto no TComponent, kas jau ievieš IInterface jums! Kad vēlaties ieviest saskarni klasē, kuru pārņem no TObject, pārliecinieties, ka tā klase manto no TInterfacedObject. Tā kā TInterfacedObject ir TObject, kas ievieš IInterface. Piemēram:
TMyClass = klase(T InterfecedObject, IConfigMainīts)
procedūra ApplyConfigChange;
beigas;
Noslēgumā jāsaprot, ka IUnknown = IInterface. IUnknown ir paredzēts COM.