Ban ben Delphi, az "interfész" két különböző jelentéssel bír. Ban ben OOP zsargon, úgy gondolhatja, hogy egy interfész osztályként van megvalósítás nélkül. A Delphi egységdefiníciós interfész szakaszán a kód minden olyan nyilvános szakaszát deklarálják, amelyek az egységben megjelennek. Ez a cikk az interfészeket OOP szempontból ismerteti.
Ha éppen úgy dolgozik, hogy egy szolid szilárd alkalmazást hozzon létre oly módon, hogy a kód fenntartható, újrafelhasználható és rugalmas legyen, OOP a Delphi természete segít az útvonal első 70% -ának vezetésében. Az interfészek meghatározása és megvalósítása segít a fennmaradó 30% -nál.
Absztrakt osztályok
Gondolhat egy interfészre, mint egy elvont osztályra, amelynek minden végrehajtása ki lett vonva és minden, ami nem nyilvános, eltávolítva. Absztrakt osztály Delphi egy olyan osztály, amely nem realizálható - nem hozhat létre objektumot absztraktként megjelölt osztályból.
Vessen egy pillantást egy interfésznyilatkozatra:
típus
IConfigChanged = felület[ '{0D57624C-CDDE-458B-A36C-436AE465B477}']
eljárás ApplyConfigChange;
vég;
Az IConfigChanged egy interfész. Az interfész ugyanúgy definiálható, mint egy osztály, az "interfész" kulcsszót használják az "osztály" helyett. A felület kulcsszóját követő Guid értéket a fordító használja az interfész egyedi azonosításához. Új GUID érték létrehozásához csak nyomja meg a Ctrl + Shift + G billentyűket a Delphi IDE-ben. Minden definiált interfésznek egyedi Guid értékre van szüksége.
Az OOP interfésze meghatározza az absztrakciót - egy sablont egy tényleges osztály számára, amely megvalósítja a felületet -, amely végrehajtja az interfész által meghatározott módszereket. Az interfész valójában nem tesz semmit, csak aláírással rendelkezik, hogy interakcióba léphessen más (végrehajtó) osztályokkal vagy interfészekkel.
A módszerek (funkciók, eljárások és tulajdonságok a Get / Set metódusok) végrehajtása az interfészt megvalósító osztályban történik. Az interfész meghatározásában nincs hatókör (magán, nyilvános, közzétett stb.), Minden nyilvános. Az interfésztípus meghatározhatja a funkciókat, az eljárásokat (amelyek végül az interfészt megvalósító osztály módszereivé válnak) és a tulajdonságokat. Amikor egy interfész meghatároz egy tulajdonságot, meg kell határoznia a get / set metódusokat - az interfészek nem tudják meghatározni a változókat.
Az osztályokhoz hasonlóan egy interfész örökölhet más interfészektől is.
típus
IConfigChangedMore = felület(IConfigChanged)
eljárás ApplyMoreChanges;
vég;
Programozás
A legtöbb Delphi fejlesztő, amikor olyan felületekre gondol, amelyek a COM programozásra gondolnak. Az interfészek azonban csak a nyelv OOP jellemzői - nem kapcsolódnak külön a COM-hez. Az interfészek meghatározhatók és megvalósíthatók egy Delphi alkalmazásban anélkül, hogy egyáltalán meg kellene érni a COM-t.
Végrehajtás
Egy felület megvalósításához hozzá kell adnia a felület nevét az osztály utasításához, az alábbiak szerint:
típus
TMainForm = osztály(TForm, IConfigChanged)
nyilvános
eljárás ApplyConfigChange;
vég;
A fenti kódban a "MainForm" elnevezésű Delphi forma megvalósítja az IConfigChanged felületet.
Figyelem: amikor egy osztály felületet valósít meg, akkor minden módszerét és tulajdonságát végre kell hajtania. Ha nem sikerül / elfelejti végrehajtani egy módszert (például: ApplyConfigChange), fordítási idő hibát okoz "E2003 nem bejelentett azonosító: 'ApplyConfigChange'" előfordul.
Figyelem: Ha megpróbálja megadni a felületet a kapott GUID érték nélkül, akkor a következőt kapja: "Az E2086 'IConfigChanged' típusa még nincs teljesen meghatározva.".
Példa
Fontolja meg az MDI alkalmazást, ahol több űrlap jeleníthető meg a felhasználó számára egyszerre. Amikor a felhasználó megváltoztatja az alkalmazás konfigurációját, a legtöbb űrlapnak frissítenie kell a kijelzőt - megjeleníthet / elrejthet néhány gombot, frissítheti a címke feliratait stb. Egy egyszerű módszerre van szüksége az összes nyitott űrlap értesítéséhez, ha megváltozott az alkalmazás konfigurációja. A feladat ideális eszköze egy felület volt.
Minden olyan űrlap, amelyet frissíteni kell a konfiguráció módosításakor, az IConfigChanged megvalósítja. Mivel a konfigurációs képernyő modálisan megjelenik, a következő kód bezárásakor biztosítja az összes IConfigChanged végrehajtási űrlap értesítését és az ApplyConfigChange hívását:
eljárás DoConfigChange ();
var
cnt: egész szám;
icc: IConfigChanged;
kezdődik
mert cnt: = 0 nak nek -1 + képernyő. FormCount csinál
kezdődik
ha Tartók (képernyő. Űrlapok [cnt], IConfigChanged, icc) azután
icc. ApplyConfigChange;
vég;
vég;
A tartók funkció (meghatározva a Sysutils.pas-ban) jelzi, hogy egy adott objektum vagy interfész támogatja-e a megadott interfészt. A kód a képernyőn ismétlődik. Űrlapgyűjtemény (a TScreen objektumról) - az alkalmazásban jelenleg megjelenített összes űrlap. Ha egy űrlap Képernyő. Forms [cnt] támogatja az interfészt, a Supports visszaadja az utolsó paraméter-paraméter felületét, és true értéket ad vissza.
Ezért, ha az űrlap megvalósítja az IConfigChanged alkalmazást, akkor az icc változó felhasználható az űrlap által megvalósított felület módszereinek meghívására. Természetesen vegye figyelembe, hogy minden formának lehet az ApplyConfigChange eljárás különféle megvalósításai.
elődök
Bármely osztálynak, amelyet a Delphi-ben definiálsz, elődenek kell lennie. A TObject az összes objektum és alkotóelem végső őse. A fenti ötlet az interfészekre is vonatkozik, az IInterface minden interfész alaposztálya. Az IInterface három módszert határoz meg: QueryInterface, _AddRef és _Release.
Ez azt jelenti, hogy az IConfigChanged is rendelkezik a 3 módszerrel, ám ezeket nem hajtottuk végre. Ennek oka az, hogy a TForm a TComponent-től örököl, amely már megvalósította az Ön számára a IInterfelt! Ha felületet akar létrehozni egy osztályban, amely a TObject-től örököl, ellenőrizze, hogy az osztály inkább a TInterfacedObject-től örököl-e. Mivel a TInterfacedObject egy TObject megvalósító IInterface. Például:
TMyClass = osztály(TInterfacedObject, IConfigChanged)
eljárás ApplyConfigChange;
vég;
Összefoglalva: IUnknown = IInterface. Az IUnknown a COM számára készült.