Definovanie a implementácia rozhraní v Delphi

v Delphi, „rozhranie“ má dva odlišné významy. v OOP žargónu, rozhranie môžete považovať za triedu bez implementácie. V časti rozhrania definície jednotky Delphi sa používa na deklarovanie všetkých verejných častí kódu, ktoré sa nachádzajú v jednotke. Tento článok vysvetľuje rozhrania z pohľadu OOP.

Ak sa chystáte vytvoriť skvelú aplikáciu tak, aby bol váš kód udržiavateľný, opakovane použiteľný a flexibilný OOP povaha Delphi vám pomôže riadiť prvých 70% vašej trasy. Definovanie rozhraní a ich implementácia pomôže so zvyšnými 30%.

Abstraktné triedy

Rozhranie si môžete predstaviť ako abstraktnú triedu s odstránenou implementáciou a všetko, čo nie je verejné, je odstránené. Abstraktná trieda v Delphi je trieda, ktorú nie je možné vytvoriť - nemôžete vytvoriť objekt z triedy označenej ako abstrakt.

Pozrime sa na príklad deklarácie rozhrania:

typ
IConfigChanged = rozhranie[{0D57624C-CDDE-458B-A36C-436AE465B477} ']
procedúra ApplyConfigChange;
koniec;

IConfigChanged je rozhranie. Rozhranie je definované rovnako ako trieda, namiesto slova „class“ sa používa kľúčové slovo „interface“. Hodnota GUID, ktorá nasleduje po kľúčovom slove rozhrania, používa kompilátor na jednoznačnú identifikáciu rozhrania. Ak chcete vygenerovať novú hodnotu GUID, stačí stlačiť Ctrl + Shift + G v Delphi IDE. Každé definované rozhranie vyžaduje jedinečnú hodnotu GUID.

instagram viewer

Rozhranie v OOP definuje abstrakciu - šablónu pre skutočnú triedu, ktorá bude implementovať rozhranie - ktorá implementuje metódy definované rozhraním. Rozhranie v skutočnosti nerobí nič, má iba podpis na interakciu s inými (implementačnými) triedami alebo rozhraniami.

Implementácia metód (funkcie, procedúry a metódy Get / Set vlastností) sa vykonáva v triede, ktorá implementuje rozhranie. V definícii rozhrania nie sú žiadne sekcie rozsahu (súkromné, verejné, publikované atď.) Všetko je verejné. Typ rozhrania môže definovať funkcie, procedúry (ktoré sa nakoniec stanú metódami triedy implementujúcej rozhranie) a vlastnosti. Keď rozhranie definuje vlastnosť, musí definovať metódy get / set - rozhrania nemôžu definovať premenné.

Tak ako pri triedach, rozhranie môže zdediť z iných rozhraní.

typ
IConfigChangedMore = rozhranie(IConfigChanged)
procedúra ApplyMoreChanges;
koniec;

programovanie

Väčšina vývojárov spoločnosti Delphi, keď myslia na rozhrania, myslia si na programovanie COM. Rozhrania sú však iba funkciou OOP jazyka - nie sú špecificky spojené s COM. Rozhrania môžu byť definované a implementované v aplikácii Delphi bez toho, aby sa vôbec dotkli COM.

uskutočnenie

Ak chcete implementovať rozhranie, musíte do príkazu class pridať názov rozhrania, napríklad v:

typ
TMainForm = trieda(TForm, IConfigChanged)
verejnosť
procedúra ApplyConfigChange;
koniec;

Vo vyššie uvedenom kóde implementuje formulár Delphi s názvom „MainForm“ rozhranie IConfigChanged.

Výstraha: keď trieda implementuje rozhranie, musí implementovať všetky svoje metódy a vlastnosti. Ak sa vám nepodarí / zabudnúť implementovať metódu (napríklad: ApplyConfigChange), chyba kompilácie času "E2003 Neohlásený identifikátor: 'ApplyConfigChange'" objaví sa.
Výstraha: ak sa pokúsite zadať rozhranie bez hodnoty GUID, dostanete: „Typ E2086„ IConfigChanged “ešte nie je úplne definovaný“.

príklad

Zvážte aplikáciu MDI, kde sa používateľovi môže súčasne zobraziť niekoľko formulárov. Keď používateľ zmení konfiguráciu aplikácie, väčšina formulárov musí aktualizovať svoje zobrazenie - zobraziť / skryť niektoré tlačidlá, aktualizovať popisky štítkov atď. Potrebujete jednoduchý spôsob, ako oznámiť všetkým otvoreným formulárom, že došlo k zmene konfigurácie aplikácie. Ideálnym nástrojom pre túto úlohu bolo rozhranie.

Každý formulár, ktorý je potrebné aktualizovať pri zmene konfigurácie, implementuje IConfigChanged. Pretože sa obrazovka konfigurácie pri modálnom zobrazení zobrazuje, keď sa zavrie, nasledujúci kód zabezpečí, aby boli všetky implementačné formuláre IConfigChanged notifikované a je volaná ApplyConfigChange:

procedúra DoConfigChange ();
var
cnt: celé číslo;
icc: IConfigChanged;
začať
pre cnt: = 0 na -1 + obrazovka. FormCount robiť
začať
ak Podpory (obrazovka. Formuláre [cnt], IConfigChanged, icc) potom
ICC. ApplyConfigChange;
koniec;
koniec;

Podpory funkcie (definované v Sysutils.pas) označuje, či daný objekt alebo rozhranie podporuje zadané rozhranie. Kód iteruje cez obrazovku. Zbierka formulárov (objektu TScreen) - všetky formuláre aktuálne zobrazené v aplikácii. Ak je formulár Obrazovka. Formy [CNT] podporuje rozhranie, Podporuje vráti rozhranie pre posledný parameter parametra a vráti true.

Preto, ak formulár implementuje IConfigChanged, premenná icc sa môže použiť na volanie metód rozhrania implementovaných vo formulári. Samozrejme, že každý formulár môže mať svoju vlastnú odlišnú implementáciu postupu ApplyConfigChange.

Predkovia

Každá trieda definovaná v Delphi musí mať predka. TObject je konečným predchodcom všetkých objektov a komponentov. Vyššie uvedená myšlienka platí aj pre rozhrania, IInterface je základná trieda pre všetky rozhrania. IInterface definuje 3 metódy: QueryInterface, _AddRef a _Release.

To znamená, že náš IConfigChanged má aj tieto 3 metódy, ale tie sme nevykonali. Je to preto, že TForm dedí od TComponent, ktorý už implementuje IInterface pre vás! Ak chcete implementovať rozhranie v triede zdedenej od TObject, uistite sa, že vaša trieda zdedí namiesto TInterfacedObject. Pretože TInterfacedObject je TObject implementujúcim IInterface. Napríklad:

TMyClass = trieda(TInterfacedObject, IConfigChanged)
procedúra ApplyConfigChange;
koniec;

Na záver, IUnknown = IInterface. IUnknown je pre COM.