Schnittstellen und Schnittstellenimplementierungen
COM unterscheidet grundlegend zwischen Schnittstellendefinitionen und ihren Implementierungen.
Eine Schnittstelle ist eigentlich ein Vertrag, der aus einer Gruppe verwandter Funktionsprototypen besteht, deren Verwendung definiert ist, deren Implementierung jedoch nicht ist. Diese Funktionsprototypen entsprechen reinen virtuellen Basisklassen in der C++-Programmierung. Eine Schnittstellendefinition gibt die Memberfunktionen der Schnittstelle an, die als Methoden bezeichnet werden, deren Rückgabetypen, die Anzahl und Typen ihrer Parameter und ihre Aufgaben. Einer Schnittstelle ist keine Implementierung zugeordnet.
Eine Schnittstellenimplementierung ist der Code, den ein Programmierer zum Ausführen der in einer Schnittstellendefinition angegebenen Aktionen liefert. 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 ihre eigenen schreiben. Eine Schnittstellenimplementierungen müssen einem Objekt zugeordnet werden, wenn eine Instanz dieses Objekts erstellt wird, und die Implementierung stellt die Dienste bereit, die das Objekt anbietet.
Beispielsweise kann eine hypothetische Schnittstelle mit dem Namen IStack zwei Methoden namens Push und Pop definieren, die angeben, dass nachfolgende Aufrufe der Pop-Methode werte, die zuvor an die Push-Methode übergeben wurden, in umgekehrter Reihenfolge zurückgeben. 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 wird, 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 somit deren Verwendung durch einen Client vollständig durch die Schnittstellendefinition bestimmt.
Einfache Objekte unterstützen nur eine einzige Schnittstelle. Kompliziertere 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 eine 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, sowie 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 die Implementierung eine einfache Rückgabe oder möglicherweise die Rückgabe einer aussagekräftigen Fehlermeldung sein, aber die Methoden müssen vorhanden sein.