Interfacepointers en interfaces
Een exemplaar van een interface-implementatie is eigenlijk een aanwijzer naar een matrix met aanwijzers naar methoden, dat wil gezegd een functietabel die verwijst naar een implementatie van alle methoden die zijn opgegeven in de interface. Objecten met meerdere interfaces kunnen aanwijzers naar meer dan één functietabel bieden. Elke code met een aanwijzer waarmee deze toegang heeft tot de matrix, kan de methoden in die interface aanroepen.
Juist over deze meervoudige indirectie spreken is onhandig, dus in plaats daarvan wordt de aanwijzer naar de interfacefunctietabel die een ander object moet moeten aanroepen, gewoon een interfaceaanwijzergenoemd. U kunt functietabellen handmatig maken in een C-toepassing of bijna automatisch met behulp van Visual C++ (of andere objectgeoriënteerde talen die COM ondersteunen).
Met de juiste compilerondersteuning (die inherent is aan C en C++), kan een client een interfacemethode aanroepen via de naam, niet de positie ervan in de matrix. Omdat een interface een type is, kan de compiler, met de namen van methoden, de typen parameters controleren en waarden retourneren van elke aanroep van de interfacemethode. Als een client daarentegen een op positie gebaseerd belschema gebruikt, is dergelijke typecontrole niet beschikbaar, zelfs niet in C of C++.
Elke interface is een onveranderbaar contract van een functionele groep methoden. U verwijst tijdens runtime naar een interface met een GLOBALLY Unique Interface Identifier (IID). Met deze IID, een specifiek exemplaar van een GUID (Globally Unique Identifier) die door COM wordt ondersteund, kan een client een object precies vragen of het de semantiek van de interface ondersteunt, zonder onnodige overhead en zonder verwarring die zich in een systeem kan voordoen, van meerdere versies van dezelfde interface met dezelfde naam.
Samenvattend is het belangrijk om te begrijpen wat een COM-interface is en niet:
- Een COM-interface is niet hetzelfde als een C++-klasse. De pure virtuele definitie heeft geen implementatie. Als u een C++-programmeur bent, kunt u uw implementatie van een interface als klasse definiëren, maar dit valt onder de kop van implementatiedetails, die com niet opgeeft. Een exemplaar van een object dat een interface implementeert, moet worden gemaakt om de interface daadwerkelijk te kunnen gebruiken. Bovendien kunnen verschillende objectklassen een interface anders implementeren, maar door elkaar worden gebruikt in binaire vorm, zolang het gedrag voldoet aan de interfacedefinitie.
- Een COM-interface is geen object. Het is gewoon een gerelateerde groep functies en is de binaire standaard waarmee clients en objecten communiceren. Zolang het pointers naar interfacemethoden kan bieden, kan het object worden geïmplementeerd in elke taal met elke interne statusweergave.
- COM-interfaces zijn sterk getypt. Elke interface heeft een eigen interface-id (een GUID), die de mogelijkheid van duplicatie elimineert die kan optreden met elk ander naamgevingsschema.
- COM-interfaces zijn onveranderbaar. U kunt geen nieuwe versie van een oude interface definiëren en deze dezelfde id geven. Het toevoegen of verwijderen van methoden van een interface of het wijzigen van semantiek maakt een nieuwe interface, niet een nieuwe versie van een oude interface. Daarom kan een nieuwe interface niet conflicteren met een oude interface. Objecten kunnen echter meerdere interfaces tegelijk ondersteunen en interfaces beschikbaar maken die opeenvolgende revisies van een interface zijn, met verschillende id's. Elke interface is dus een afzonderlijk contract en systeemomvattende objecten hoeven zich geen zorgen te maken over de vraag of de versie van de interface die ze aanroepen de versie is die ze verwachten. De interface-id (IID) definieert het interfacecontract expliciet en uniek.
Verwante onderwerpen