Definování a implementace rozhraní v Delphi

click fraud protection

v Delphi, „rozhraní“ má dva odlišné významy. v OOP žargon, můžete rozhraní považovat za třídu bez implementace. V sekci rozhraní Delphi se definice rozhraní používá k deklaraci všech veřejných částí kódu, které se objevují v jednotce. Tento článek vysvětlí rozhraní z pohledu OOP.

Pokud se chystáte vytvořit rock-solid aplikaci tak, aby váš kód byl udržovatelný, opakovaně použitelný a flexibilní OOP povaha Delphi vám pomůže řídit prvních 70% vaší trasy. Definování rozhraní a jejich implementace pomůže se zbývajících 30%.

Abstraktní třídy

Můžete si představit rozhraní jako abstraktní třídu se všemi implementacemi zbavenými a vše, co není veřejné, je odstraněno. Abstraktní třída v Delphi je třída, kterou nelze konkretizovat - nemůžete vytvořit objekt ze třídy označené jako abstraktní.

Podívejme se na příklad deklarace rozhraní:

typ
IConfigChanged = rozhraní['{0D57624C-CDDE-458B-A36C-436AE465B477}']
postup ApplyConfigChange;
konec;

IConfigChanged je rozhraní. Rozhraní je definováno podobně jako třída, místo slova „class“ se používá klíčové slovo „interface“. Hodnota Guid, která následuje za klíčovým slovem rozhraní, používá kompilátor k jedinečné identifikaci rozhraní. Chcete-li vygenerovat novou hodnotu GUID, stačí stisknout Ctrl + Shift + G v Delphi IDE. Každé definované rozhraní potřebuje jedinečnou hodnotu Guid.

instagram viewer

Rozhraní v OOP definuje abstrakci - šablonu pro skutečnou třídu, která bude implementovat rozhraní - která implementuje metody definované rozhraním. Rozhraní ve skutečnosti nic nedělá, má pouze podpis pro interakci s jinými (implementačními) třídami nebo rozhraními.

Implementace metod (funkce, procedury a metody Get / Set) se provádí ve třídě implementující rozhraní. V definici rozhraní neexistují žádné sekce (soukromé, veřejné, publikované atd.), Vše je veřejné. Typ rozhraní může definovat funkce, procedury (které se nakonec stanou metodami třídy implementující rozhraní) a vlastnosti. Když rozhraní definuje vlastnost, musí definovat metody get / set - rozhraní nemohou definovat proměnné.

Stejně jako u tříd může rozhraní dědit z jiných rozhraní.

typ
IConfigChangedMore = rozhraní(IConfigChanged)
postup ApplyMoreChanges;
konec;

Programování

Většina vývojářů Delphi, když myslí na rozhraní, myslí na programování COM. Rozhraní jsou však pouze funkcí OOP jazyka - nejsou specificky vázána na COM. Rozhraní lze definovat a implementovat v aplikaci Delphi, aniž by se vůbec dotkla COM.

Implementace

Chcete-li implementovat rozhraní, musíte do příkazu class přidat název rozhraní, jako v:

typ
TMainForm = třída(TForm, IConfigChanged)
veřejnost
postup ApplyConfigChange;
konec;

Ve výše uvedeném kódu implementuje formulář Delphi s názvem "MainForm" rozhraní IConfigChanged.

Varování: když třída implementuje rozhraní, musí implementovat všechny své metody a vlastnosti. Pokud se vám nepodaří / zapomenete implementovat metodu (například: ApplyConfigChange), dojde k chybě kompilace "E2003 Nehlášený identifikátor: 'ApplyConfigChange'" objeví se.
Varování: Pokud se pokusíte zadat rozhraní bez hodnoty GUID, obdržíte: "E2086 Typ 'IConfigChanged' dosud není zcela definován".

Příklad

Zvažte aplikaci MDI, kde se uživateli může zobrazit několik formulářů najednou. Když uživatel změní konfiguraci aplikace, většina formulářů musí aktualizovat své zobrazení - zobrazit / skrýt některá tlačítka, aktualizovat popisky štítků atd. Budete potřebovat jednoduchý způsob, jak oznámit všem otevřeným formulářům, že došlo ke změně konfigurace aplikace. Ideálním nástrojem pro tuto úlohu bylo rozhraní.

Každý formulář, který je třeba aktualizovat při změně konfigurace, implementuje IConfigChanged. Vzhledem k tomu, že se konfigurační obrazovka zobrazuje modálně, při zavření příští kód zajistí, aby všechny implementační formuláře IConfigChanged byly oznámeny a byl použit příkaz ApplyConfigChange:

postup DoConfigChange ();
var
cnt: celé číslo;
icc: IConfigChanged;
začít
pro cnt: = 0 na -1 + obrazovka. FormCount dělat
začít
-li Podpory (obrazovka. Formuláře [cnt], IConfigChanged, icc) pak
icc. ApplyConfigChange;
konec;
konec;

Podpory funkce (definované v Sysutils.pas) označuje, zda daný objekt nebo rozhraní podporuje zadané rozhraní. Kód iteruje skrz obrazovku. Kolekce formulářů (objektu TScreen) - všechny formuláře aktuálně zobrazené v aplikaci. Pokud je formulář Obrazovka. Formuláře [cnt] podporuje rozhraní, Podporuje vrací rozhraní pro poslední parametr parametru a vrací true.

Pokud tedy formulář implementuje IConfigChanged, lze proměnnou icc použít k vyvolání metod rozhraní implementovaných do formuláře. Samozřejmě, že každý formulář může mít jeho vlastní různá implementace procedury ApplyConfigChange.

Předky

Každá třída, kterou definujete v Delphi, musí mít předka. TObject je konečný předek všech objektů a komponent. Výše uvedená myšlenka platí také pro rozhraní, IInterface je základní třída pro všechna rozhraní. IInterface definuje 3 metody: QueryInterface, _AddRef a _Release.

To znamená, že naše IConfigChanged má také tyto 3 metody, ale ty jsme neimplementovali. Důvodem je, že TForm dědí od TComponent, který pro vás již implementuje IInterface! Pokud chcete implementovat rozhraní ve třídě, která dědí od TObject, ujistěte se, že vaše třída zdědí místo TInterfacedObject. Protože TInterfacedObject je TObject implementující IInterface. Například:

TMyClass = třída(TInterfacedObject, IConfigChanged)
postup ApplyConfigChange;
konec;

Závěrem, IUnknown = IInterface. IUnknown je pro COM.

instagram story viewer