Illesztőmutatók és interfészek
Az interfész implementációjának egy példánya valójában egy metódusokra mutató mutatótömb , vagyis egy függvénytábla, amely az interfészben megadott összes metódus implementálására hivatkozik. A több felülettel rendelkező objektumok több függvénytáblához is adhatnak mutatót. A tömbhöz hozzáférő mutatóval rendelkező kódok meghívhatják az adott felületen található metódusokat.
Ha pontosan erről a több indirektről van szó, az kényelmetlen, ezért ehelyett az illesztőfüggvény táblázatára mutató mutatót, amelyet egy másik objektumnak meg kell hívnia a metódusait, egyszerűen felületmutatónak. A függvénytáblákat manuálisan vagy szinte automatikusan is létrehozhatja a Visual C++ (vagy a COM-t támogató egyéb objektumorientált nyelvek) használatával.
Megfelelő fordítótámogatással (amely a C és a C++-ban rejlik) az ügyfél a neve alapján hívhat meg egy interfészmetódust, nem pedig a tömbben elfoglalt pozícióját. Mivel az interfész típus, a fordító a metódusok nevének megadva ellenőrizheti a paraméterek típusait, és visszaadhatja az egyes interfészmetódus-hívások értékeit. Ezzel szemben, ha egy ügyfél pozícióalapú hívássémát használ, az ilyen típusellenőrzés még C vagy C++ nyelven sem érhető el.
Minden interfész a metódusok funkcionális csoportjának nem módosítható szerződése. Futtatáskor egy globálisan egyedi felületazonosítóval (IID) hivatkozik egy felületre. Ez az IID, amely a COM által támogatott globálisan egyedi azonosító (GUID) egy konkrét példánya, lehetővé teszi az ügyfél számára, hogy pontosan megkérdezze az objektumot, hogy támogatja-e a felület szemantikáját anélkül, hogy felesleges többletterhelést okozna, és anélkül, hogy a rendszer összekeverné azokat a félreértéseket, amelyek abból adódhatnak, hogy ugyanazon felület több verziója is ugyanazzal a névvel rendelkezik.
Összefoglalva fontos megérteni, hogy mi az a COM-felület, és nem az:
- A COM-felület nem ugyanaz, mint egy C++ osztály. A tiszta virtuális definíció nem valósít meg implementációt. Ha Ön C++ programozó, osztályként definiálhatja az interfész implementálását, de ez a megvalósítás részleteinek címsorába tartozik, amelyet a COM nem határoz meg. Az interfészt megvalósító objektum egy példányát létre kell hozni ahhoz, hogy a felület ténylegesen létezni lehessen. Ezenkívül a különböző objektumosztályok eltérően implementálhatnak egy interfészt, de bináris formában felcserélhetők, feltéve, hogy a viselkedés megfelel az interfész definíciójának.
- A COM-felület nem objektum. Ez egyszerűen egy kapcsolódó függvénycsoport, és az ügyfelek és objektumok kommunikációjának bináris szabványa. Mindaddig, amíg az illesztőmetódusokhoz mutat, az objektum bármilyen nyelven implementálható bármilyen belső állapotábrázolással.
- A COM-felületek erősen be vannak gépelve. Minden illesztő saját felületazonosítóval (GUID) rendelkezik, amely kiküszöböli a más elnevezési sémákban előforduló duplikációk lehetőségét.
- A COM-felületek nem módosíthatók. A régi felület új verzióját nem határozhatja meg, és nem adhat meg ugyanazt az azonosítót. Az illesztő metódusainak hozzáadása vagy eltávolítása vagy a szemantikák módosítása új felületet hoz létre, nem pedig egy régi felület új verzióját. Ezért egy új felület nem ütközhet egy régi felülettel. Az objektumok azonban egyszerre több illesztőt is támogathatnak, és különböző azonosítókkal elérhetővé tehetik a felület egymást követő változatait. Így minden interfész külön szerződés, és a rendszerszintű objektumoknak nem kell aggódniuk amiatt, hogy az általuk hívott felület verziója-e az elvárt verzió. A felületazonosító (IID) explicit módon és egyedileg határozza meg az interfészszerződést.
Kapcsolódó témakörök