Ponteiros de interface e interfaces
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ção 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 indireção múltipla é inconveniente, então, 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 ponteiro de interface. Você pode criar manualmente tabelas de função em um aplicativo C ou quase automaticamente usando o Visual C++ (ou outras linguagens orientadas a objeto que oferecem suporte a COM).
Com o suporte apropriado ao compilador (que é inerente ao C e C++), um cliente pode chamar um método de interface por meio de seu nome, não de sua posição na matriz. Como uma interface é um tipo, o compilador, dado os nomes dos métodos, pode verificar os tipos de parâmetros e valores de retorno 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 identificador de interface global exclusivo (IID). Este IID, que é uma instância específica de um identificador global exclusivo (GUID) suportado pelo COM, permite que um cliente pergunte a um objeto precisamente se ele suporta a semântica da interface, sem sobrecarga desnecessária e sem a confusão que poderia surgir em um sistema por ter várias versões da mesma interface com o mesmo nome.
Para resumir, é importante entender o que é e o que não é uma interface COM:
- Uma interface COM não é o mesmo que uma classe C++. A definição virtual pura não tem implementação. Se você for um programador C++, poderá definir sua implementação de uma interface como uma classe, mas isso se enquadra no título de detalhes de implementação, que o 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, diferentes classes de objeto podem implementar uma interface de forma diferente, mas ser usadas alternadamente na forma binária, desde que o comportamento esteja de acordo com a definição da interface.
- Uma interface COM não é um objeto. É simplesmente um grupo relacionado de funções e é o padrão binário através do qual clientes e objetos se comunicam. Contanto que ele possa fornecer ponteiros para métodos de interface, o objeto pode ser implementado em qualquer linguagem com qualquer representação de estado interno.
- As interfaces COM são fortemente tipadas. Cada interface tem seu próprio identificador de interface (um GUID), o que elimina a possibilidade de duplicação que poderia ocorrer com qualquer outro esquema de nomenclatura.
- As interfaces COM são imutáveis. Não é possível 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 oferecer suporte a várias interfaces simultaneamente e podem expor interfaces que são revisões sucessivas de uma interface, com identificadores diferentes. Assim, cada interface é um contrato separado, e os objetos de todo o sistema não precisam se preocupar se a versão da interface que estão chamando é a que eles esperam. O ID da interface (IID) define o contrato de interface de forma explícita e exclusiva.
Tópicos relacionados