Ponteiros e interfaces da interface
Uma instância de uma implementação de interface é, na verdade, um ponteiro para uma matriz de ponteiros para métodos, ou seja, uma tabela de funções que se refere a uma implementação de todos os métodos especificados na interface. Objetos com várias interfaces podem fornecer ponteiros para mais de uma tabela de funções. Qualquer código que tenha um ponteiro por meio do qual ele possa acessar a matriz pode chamar os métodos nessa interface.
Falar precisamente sobre essa indireta múltipla é inconveniente, portanto, em vez disso, o ponteiro para a tabela de funções de interface que outro objeto deve ter para chamar seus métodos é chamado simplesmente de um ponteiro de interface . Você pode criar tabelas de funções manualmente em um aplicativo C ou quase automaticamente usando o Visual C++ (ou outras linguagens orientadas a objetos que dão suporte a COM).
Com o suporte ao compilador apropriado (que é inerente a C e C++), um cliente pode chamar um método de interface por meio de seu nome, não sua posição na matriz. Como uma interface é um tipo, o compilador, considerando os nomes dos métodos, pode verificar os tipos de parâmetros e retornar valores de cada chamada de método de interface. Por outro lado, se um cliente usa um esquema de chamada baseado em posição, essa verificação de tipo não está disponível, mesmo em C ou C++.
Cada interface é um contrato imutável de um grupo funcional de métodos. Você faz referência a uma interface em tempo de execução com um IID (identificador de interface global exclusivo). Essa IID, que é uma instância específica de um GUID (identificador global exclusivo) com suporte pelo COM, permite que um cliente pergunte precisamente a um objeto se ele dá suporte à semântica da interface, sem sobrecarga desnecessária e sem a confusão que pode surgir em um sistema de ter várias versões da mesma interface com o mesmo nome.
Para resumir, é importante entender o que é uma interface COM e não é:
- Uma interface COM não é igual a uma classe C++. A definição virtual pura não contém nenhuma implementação. Se você for um programador C++, poderá definir a implementação de uma interface como uma classe, mas isso se enquadra no título de detalhes de implementação, que COM não especifica. Uma instância de um objeto que implementa uma interface deve ser criada para que a interface realmente exista. Além disso, classes de objeto diferentes podem implementar uma interface de forma diferente, mas ser usadas de forma intercambiável no formato binário, desde que o comportamento esteja em conformidade com a definição da interface.
- Uma interface COM não é um objeto. Ele é simplesmente um grupo relacionado de funções e é o padrão binário por meio do qual clientes e objetos se comunicam. Desde que possa fornecer ponteiros para métodos de interface, o objeto pode ser implementado em qualquer idioma com qualquer representação de estado interno.
- As interfaces COM são fortemente tipada. Cada interface tem seu próprio identificador de interface (um GUID), o que elimina a possibilidade de duplicação que pode ocorrer com qualquer outro esquema de nomenclatura.
- As interfaces COM são imutáveis. Você não pode definir uma nova versão de uma interface antiga e dar-lhe o mesmo identificador. Adicionar ou remover métodos de uma interface ou alterar a semântica cria uma nova interface, não uma nova versão de uma interface antiga. Portanto, uma nova interface não pode entrar em conflito com uma interface antiga. No entanto, os objetos podem dar suporte a várias interfaces simultaneamente e podem expor interfaces que são revisões sucessivas de uma interface, com diferentes identificadores. Portanto, cada interface é um contrato separado, e os objetos em todo o sistema não precisam se preocupar se a versão da interface que eles estão chamando é a que eles esperam. A ID da interface (IID) define o contrato de interface de forma explícita e exclusiva.
Tópicos relacionados