Ponteiros e interfaces de 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 através do qual ele pode 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 suportam COM).
Com suporte apropriado ao compilador (que é inerente em C e C++), um cliente pode chamar um método de interface através de seu nome, não de sua posição na matriz. Como uma interface é um tipo, o compilador, dados 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 globalmente 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 carrega nenhuma implementação. Se você é um programador C++, você pode definir sua 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, diferentes classes de objeto podem implementar uma interface de forma diferente, mas ser usadas de forma intercambiável na forma binária, desde que o comportamento esteja em conformidade 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. Desde que 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 atribuir-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 suportar 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 eles estão chamando é a que eles esperam. O ID de interface (IID) define o contrato de interface de forma explícita e exclusiva.
Tópicos relacionados