Herança, agregação e contenção

COM a capacidade de reutilização do .NET estrutura é realizada por meio de herança.Tipos COM podem participar de herança sistema autônomo uma classe base.Use os modelos de herança, agregação ou confinamento nas seguintes circunstâncias:

Modelo

Use para

Herança

Expondo o objeto gerenciado sistema autônomo objeto externo.

Agregação

Ativando o objeto externo para expor a implementação do objeto de uma interface sem modificação.

Contenção

Ativando o objeto externo para modificar o comportamento do objeto interno.

Herança

Quando interfaces gerenciadas são expostos para com., eles estendem sempre IUnknown or IDispatch, mesmo quando a interface é herdada de outra interface no lado gerenciado.A mesma regra se aplica à interfaces de classe que são geradas para classes gerenciadas.

O .NET estrutura amplia o modelo de COM para reutilização, adicionando a herança de implementação.Tipos gerenciado derivam direta ou indiretamente de uma coclass COM; mais especificamente, eles podem ser obtidos com o runtime callable wrapper gerado pelo tempo de execução.O tipo derivado pode expor todos sistema autônomo método e propriedades do objeto COM, bem sistema autônomo métodos e propriedades implementadas em código gerenciado.O objeto resultante é parcialmente implementado em código gerenciado e parcialmente implementado em código não gerenciado.

Para qualificar sistema autônomo uma classe base, o coclass deve:

Tipos gerenciado podem estender o RCW para uma coclass de qualificação e substituir os métodos fornecidos pelo objeto base.Se você desejar substituir qualquer um dos métodos, você deve substituir todos os métodos básicos de uma interface.

Um tipo gerenciado herda de um RCW da mesma forma que ele herda de um objeto gerenciado de base.No exemplo de código a seguir, o gerenciado Catapult classe deriva de AcmeLib.Slingshot, um tipo COM.

#using "AcmeLib.dll"    // Provides definition of Slingshot.

__gc class Catapult : public AcmeLib.Slingshot  // Extends the COM type.
{
    // Delegates to base implementation.
    Load() { //… };  
   
    Fire()               
    {
        // Engages in some behavior before delegating to the base 
        // implementation.
        Slingshot::Fire();
    }

    // The Aim method needs to be overridden.
    Aim() { //… }         
}
Catapult *cp = new Catapult();

// Calls derived implementation.
cp->Load();
// Calls base implementation.
cp->Aim();
// Calls derived which delegates to base.
cp->Fire();

Agregação

Para expor sistema autônomo interfaces de uma classe COM que eles foram implementados em uma segunda classe COM, a segunda classe agrega o primeiro.Um objeto COM pode agregar um objeto. NET, caso em que todas as interfaces do objeto, incluindo sua interface de classe, estão disponível através do objeto externo.O objeto .NET interno delega chamadas para o seu IUnknown métodos para o controle IUnknown.

Agregação é um pouco mais complexa do que a contenção (descrita na próxima seção).Você geralmente usa-lo para permitir que o objeto externo para expor a implementação do objeto de uma interface sem modificação.Todos sistema autônomo objetos gerenciados automaticamente suportam agregação COM estilo com o objeto gerenciado que está sendo usado sistema autônomo objeto interno.Agregar um objeto gerenciado, o objeto não gerenciado externo cria o objeto de interno gerenciado chamando CoCreateInstance, em seguida, passando IUnknown sistema autônomo an OuterUnknown parâmetro.Quando um externa IUnknown é passado para um objeto gerenciado durante a construção, o objeto gerenciado armazena em cache a interface e o usa sistema autônomo a seguir:

  • O objeto externo mantiver o interna IUnknownnondelegating da IUnknown.O nondelegatingIUnknown se comporta sistema autônomo um normal IUnknown se comporta; isto é, tenha êxito se o objeto implementa a interface e falha caso contrário.O nondelegatingIUnknown não encaminha a telefonar para o objeto externo.

  • Se o objeto interno é consultado para uma interface que não oferece suporte, o objeto interno delega a telefonar IUnknown interface.

  • Todas as chamadas para o QueryInterface, AddRef and Versão delegadas do objeto externo métodos do objeto internoIUnknown.

Esses três comportamentos tornam possível agregar qualquer objeto gerenciado.Com esse tipo de relação de agregação, é possível ter um único objeto COM parcialmente implementada no código gerenciado (a parte interna) e parcialmente no código não gerenciado (a parte exterior).

Contenção

Um objeto .NET pode conter um objeto COM, importando seus metadados para um assembly .NET e, em seguida, declarando um membro de dados desse tipo em outra classe.Assim sistema autônomo com a detenção COM normal, você pode chamar interfaces do objeto COM em suas próprias implementações de interface, mas o objeto contido, não é exposto fora da classe.Confinamento é mais simples do que a agregação.Você geralmente usa contenção quando o objeto externo precisa modificar o comportamento do objeto interno.Para fazer isso, o objeto externo simplesmente cria uma instância do objeto interno em seu construtor e delega chamadas para o objeto interno sistema autônomo necessário.O objeto externo pode escolher quais chamadas para delegado e quais chamadas para manipular diretamente.O tempo de execução tem sem requisitos especiais para objetos oferecer suporte a contenção.

Um objeto COM também pode conter um objeto. NET.Comportamento em relação a clientes do objeto COM é exatamente o mesmo sistema autônomo se o objeto contido fosse qualquer Outros objeto COM.

Consulte também

Conceitos

Expondo componentes COM para o .NET estrutura

Expondo componentes .NET estrutura para com.

Outros recursos

Interoperabilidade COM avançada