Ukazatele rozhraní a rozhraní
Instance implementace rozhraní je ve skutečnosti ukazatel na pole ukazatelů na metody - to znamená tabulka funkcí, která odkazuje na implementaci všech metod zadaných v rozhraní. Objekty s více rozhraními můžou poskytovat ukazatele na více než jednu tabulku funkcí. Jakýkoli kód, který má ukazatel, přes který má přístup k poli, může volat metody v daném rozhraní.
Když mluvíme přesně o této více nepřímých znacích, je neskonvenentní, takže ukazatel na tabulku funkcí rozhraní, že jiný objekt musí volat své metody, se nazývá jednoduše ukazatel rozhraní . Tabulky funkcí můžete v aplikaci jazyka C vytvořit ručně nebo téměř automaticky pomocí jazyka Visual C++ (nebo jiných objektově orientovaných jazyků, které podporují com).
S odpovídající podporou kompilátoru (která je nedílnou součástí jazyka C a C++), klient může metodu rozhraní volat prostřednictvím svého názvu, nikoli svou pozici v poli. Vzhledem k tomu, že rozhraní je typ, kompilátor s ohledem na názvy metod, může kontrolovat typy parametrů a návratové hodnoty každého volání metody rozhraní. Naproti tomu pokud klient používá schéma volání založené na pozici, taková kontrola typů není k dispozici ani v jazyce C nebo C++.
Každé rozhraní je neměnný kontrakt funkční skupiny metod. Na rozhraní odkazujete za běhu s globálně jedinečným identifikátorem rozhraní (IID). Tento identifikátor IID, což je specifická instance globálně jedinečného identifikátoru (GUID) podporovaného com, umožňuje klientovi přesně požádat objekt, zda podporuje sémantiku rozhraní, bez zbytečné režie a bez nejasností, které by mohly vzniknout v systému z více verzí stejného rozhraní se stejným názvem.
Pro shrnutí je důležité pochopit, co je rozhraní MODELU COM, a nikoli:
- Rozhraní MODELU COM není stejné jako třída C++. Čistá virtuální definice nemá žádnou implementaci. Pokud jste programátor jazyka C++, můžete definovat implementaci rozhraní jako třídu, ale to spadá pod nadpis podrobností implementace, které com neurčí. Instance objektu, který implementuje rozhraní, musí být vytvořena, aby rozhraní skutečně existovalo. Kromě toho mohou různé třídy objektů implementovat rozhraní odlišně, ale být použity zaměnitelně v binární podobě, pokud chování odpovídá definici rozhraní.
- Rozhraní COM není objekt. Jedná se jednoduše o související skupinu funkcí a jedná se o binární standard, pomocí kterého klienti a objekty komunikují. Pokud může poskytovat ukazatele na metody rozhraní, lze objekt implementovat v libovolném jazyce s jakoukoli interní reprezentací stavu.
- Rozhraní MODELU COM jsou silně typovaná. Každé rozhraní má svůj vlastní identifikátor rozhraní (GUID), který eliminuje možnost duplikace, která by mohla nastat s jakýmkoli jiným schématem pojmenování.
- Rozhraní COM jsou neměnná. Nemůžete definovat novou verzi starého rozhraní a dát mu stejný identifikátor. Přidání nebo odebrání metod rozhraní nebo změna sémantiky vytvoří nové rozhraní, nikoli novou verzi starého rozhraní. Nové rozhraní proto nemůže být v konfliktu se starým rozhraním. Objekty však mohou podporovat více rozhraní současně a mohou vystavit rozhraní, která jsou po sobě jdoucí revize rozhraní s různými identifikátory. Každé rozhraní je tedy samostatný kontrakt a objekty pro celou organizaci nemusí být znepokojeni tím, zda verze rozhraní, které volají, je ta, kterou očekávají. ID rozhraní (IID) definuje kontrakt rozhraní explicitně a jednoznačně.
Související témata