Schnittstellenzeiger und Schnittstellen
Eine Instanz einer Schnittstellenimplementierung ist tatsächlich ein Zeiger auf ein Array von Zeigern auf Methoden , d. h. eine Funktionstabelle, die auf eine Implementierung aller in der Schnittstelle angegebenen Methoden verweist. Objekte mit mehreren Schnittstellen können Zeiger auf mehrere Funktionstabellen bereitstellen. Jeder Code mit einem Zeiger, über den es auf das Array zugreifen kann, kann die Methoden in dieser Schnittstelle aufrufen.
Genau über diese mehrfache Dereferenzierung zu sprechen ist unannelich. Stattdessen wird der Zeiger auf die Schnittstellenfunktionstabelle, über die ein anderes Objekt seine Methoden aufrufen muss, einfach ein Schnittstellenzeigeraufgerufen. Sie können Funktionstabellen in einer C-Anwendung oder fast automatisch mithilfe von Visual C++ (oder anderen objektorientierten Sprachen, die COM unterstützen) manuell erstellen.
Bei entsprechender Compilerunterstützung (die in C und C++ enthalten ist), kann ein Client eine Schnittstellenmethode über seinen Namen und nicht über seine Position im Array aufrufen. Da es sich bei einer Schnittstelle um einen Typ handelt, kann der Compiler mit den Namen der Methoden die Typen von Parametern überprüfen und Werte jedes Schnittstellenmethodenaufrufs zurückgeben. Wenn ein Client dagegen ein positionsbasiertes Aufrufschema verwendet, ist diese Typüberprüfung auch in C oder C++ nicht verfügbar.
Jede Schnittstelle ist ein unveränderlicher Vertrag einer funktionalen Gruppe von Methoden. Sie verweisen zur Laufzeit auf eine Schnittstelle mit einem global eindeutigen Schnittstellenbezeichner (IID). Diese IID, die eine bestimmte Instanz eines global eindeutigen Bezeichners (GUID) ist, der von COM unterstützt wird, ermöglicht es einem Client, ein Objekt genau zu fragen, ob es die Semantik der Schnittstelle unterstützt, ohne unnötigen Aufwand und ohne die Verwirrung, die in einem System entstehen könnte, mehrere Versionen derselben Schnittstelle mit demselben Namen zu haben.
Zusammenfassend ist es wichtig zu verstehen, was eine COM-Schnittstelle ist und was nicht:
- Eine COM-Schnittstelle ist nicht identisch mit einer C++-Klasse. Die reine virtuelle Definition trägt keine Implementierung. Wenn Sie ein C++-Programmierer sind, können Sie die Implementierung einer Schnittstelle als Klasse definieren, dies liegt jedoch unter der Überschrift der Implementierungsdetails, die COM nicht angeben. Eine Instanz eines Objekts, das eine Schnittstelle implementiert, muss erstellt werden, damit die Schnittstelle tatsächlich vorhanden ist. Darüber hinaus können unterschiedliche Objektklassen eine Schnittstelle anders implementieren, aber in binärer Form austauschbar verwendet werden, solange das Verhalten der Schnittstellendefinition entspricht.
- Eine COM-Schnittstelle ist kein Objekt. Es handelt sich einfach um eine verwandte Gruppe von Funktionen und ist der binäre Standard, über den Clients und Objekte kommunizieren. Solange es Zeiger auf Schnittstellenmethoden bereitstellen kann, kann das Objekt in jeder Sprache mit jeder internen Zustandsdarstellung implementiert werden.
- COM-Schnittstellen sind stark typiert. Jede Schnittstelle verfügt über einen eigenen Schnittstellenbezeichner (eine GUID), wodurch die Möglichkeit der Duplizierung vermieden wird, die mit einem anderen Benennungsschema auftreten kann.
- COM-Schnittstellen sind unveränderlich. Sie können keine neue Version einer alten Schnittstelle definieren und ihm denselben Bezeichner zuordnen. Das Hinzufügen oder Entfernen von Methoden einer Schnittstelle oder der Änderung der Semantik erstellt eine neue Schnittstelle, nicht eine neue Version einer alten Schnittstelle. Daher kann eine neue Schnittstelle nicht mit einer alten Schnittstelle in Konflikt geraten. Objekte können jedoch mehrere Schnittstellen gleichzeitig unterstützen und Schnittstellen verfügbar machen, die aufeinanderfolgende Überarbeitungen einer Schnittstelle mit unterschiedlichen Bezeichnern sind. Daher ist jede Schnittstelle ein separater Vertrag, und systemweite Objekte müssen sich keine Gedanken darüber machen, ob die Version der schnittstelle, die sie aufrufen, die von ihnen erwartet wird. Die Schnittstellen-ID (IID) definiert den Schnittstellenvertrag explizit und eindeutig.
Verwandte Themen