Schnittstellen und Schnittstellenimplementierungen

COM unterscheidet grundlegend zwischen Schnittstellendefinitionen und deren Implementierungen.

Eine Schnittstelle ist eigentlich ein Vertrag, der aus einer Gruppe verwandter Funktionsprototypen besteht, deren Verwendung definiert ist, deren Implementierung jedoch nicht erfolgt. Diese Funktionsprototypen entsprechen reinen virtuellen Basisklassen in der C++-Programmierung. Eine Schnittstellendefinition gibt die Memberfunktionen der Schnittstelle an , die methoden genannt werden, deren Rückgabetypen, die Anzahl und die Typen der Parameter und was sie tun müssen. Einer Schnittstelle ist keine Implementierung zugeordnet.

Eine Schnittstellenimplementierung ist der Code, den ein Programmierer bereitstellt, um die in einer Schnittstellendefinition angegebenen Aktionen auszuführen. Implementierungen vieler Schnittstellen, die ein Programmierer in einer objektbasierten Anwendung verwenden kann, sind in den COM-Bibliotheken enthalten. Programmierer können diese Implementierungen jedoch ignorieren und eigene schreiben. Eine Schnittstellenimplementierung muss einem Objekt zugeordnet werden, wenn ein instance dieses Objekts erstellt wird, und die Implementierung stellt die Dienste bereit, die das Objekt anbietet.

Beispielsweise könnte eine hypothetische Schnittstelle namens IStack zwei Methoden definieren, mit den Namen Push und Pop, wobei angegeben wird, dass aufeinanderfolgende Aufrufe der Pop-Methode in umgekehrter Reihenfolge Werte zurückgeben, die zuvor an die Push-Methode übergeben wurden. Diese Schnittstellendefinition würde nicht angeben, wie die Funktionen im Code implementiert werden sollen. Bei der Implementierung der Schnittstelle könnte ein Programmierer den Stapel als Array implementieren und die Push- und Pop-Methoden so implementieren, dass auf dieses Array zugegriffen werden kann, während ein anderer Programmierer möglicherweise eine verknüpfte Liste verwendet und die Methoden entsprechend implementiert. Unabhängig von einer bestimmten Implementierung der Push- und Pop-Methoden wird die In-Memory-Darstellung eines Zeigers auf eine IStack-Schnittstelle und damit dessen Verwendung durch einen Client vollständig durch die Schnittstellendefinition bestimmt.

Einfache Objekte unterstützen nur eine einzelne Schnittstelle. Komplexere Objekte, z. B. einbettbare Objekte, unterstützen in der Regel mehrere Schnittstellen. Clients haben zugriff auf ein COM-Objekt nur über einen Zeiger auf eine seiner Schnittstellen, wodurch der Client wiederum jede der Methoden aufrufen kann, aus denen diese Schnittstelle besteht. Diese Methoden bestimmen, wie ein Client die Daten des Objekts verwenden kann.

Schnittstellen definieren einen Vertrag zwischen einem Objekt und seinen Clients. Der Vertrag gibt die Methoden an, die jeder Schnittstelle zugeordnet werden müssen, und das Verhalten der einzelnen Methoden in Bezug auf Eingabe und Ausgabe. Der Vertrag definiert im Allgemeinen nicht, wie die Methoden in einer Schnittstelle implementiert werden. Ein weiterer wichtiger Aspekt des Vertrags ist, dass ein Objekt, das eine Schnittstelle unterstützt, alle Methoden dieser Schnittstelle in irgendeiner Weise unterstützen muss. Nicht alle Methoden in einer Implementierung müssen etwas tun. Wenn ein Objekt die von einer Methode implizierte Funktion nicht unterstützt, kann seine Implementierung eine einfache Rückgabe oder vielleicht die Rückgabe einer aussagekräftigen Fehlermeldung sein, aber die Methoden müssen vorhanden sein.

COM-Objekte und -Schnittstellen