Interfaces de sintetização (MIDL 3.0)

Atribuindo membros a interfaces

uma classe de Windows Runtime opera em termos de interfaces. As interfaces foram mal mencionadas na maioria dos exemplos anteriores, no entanto, porque normalmente são um detalhe de implementação que você não precisa controlar na maioria dos casos.

Como resultado, quando a descrição de sua classe não faz referência a uma interface, mas quando uma delas é necessária para implementar a classe — o compilador MIDL 3,0 sintetiza e a adiciona, conforme necessário.

Construtor padrão

quando você declara um construtor padrão como um membro de uma classe, o compilador produz uma classe Windows Runtime que é ativável por padrão. No nível de implementação, isso significa que os metadados descrevem a classe como ativável padrão e a fábrica de classes para o runtimeclass implementa a interface IActivationFactory .

runtimeclass Area
{
    Area();
    ...
}

Nesse caso, a área é compilada com os metadados [Activatable] com um tipo de null .

Construtor (s) não padrão

quando você declara um ou mais construtores não padrão como membros de uma classe, o compilador produz uma classe Windows Runtime que é ativável, em vez de ativável por padrão. No nível de implementação, isso significa que os metadados descreverão a classe como ativável e especificarão a interface que contém os métodos do construtor.

Por padrão, essa interface é nomeada < comoClassName> Factory, e a fábrica de classes para o runtimeclass implementa essa interface. Se esse nome de interface já estiver em uso, o compilador acrescentará um sufixo de numeral inteiro (começando com 2), até que ele Localize um nome não utilizado.

runtimeclass Area
{
    Area(Int32 width, Int32 height);
    ...
}

Nesse caso, o compilador

  • sintetiza uma interface de fábrica chamada IAreaFactory,
  • Adiciona um exclusiveto atributo à interface sintetizada, especificando que a interface só pode ser referenciada pela classe de tempo de execução e
  • Adiciona um activatable atributo à classe Runtime indicando que os clientes podem usar membros da interface IAreaFactory para criar instâncias da classe.

Portanto, o MIDL acima pode ser interpretado da seguinte maneira.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Uma classe pode conter um construtor padrão e construtores não padrão adicionais.

runtimeclass Area
{
    Area();
    Area(Int32 width, Int32 height);
    ...
}

Nesse caso, o MIDL pode ser interpretado da seguinte maneira; com ambas as formas do activatable atributo.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable()]
[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Membros da Instância

No exemplo abaixo, a área tem a altura e a largurados membros.

runtimeclass Area : Windows.Foundation.IStringable
{
    Int32 Height;
    Int32 Width;
}

Esses membros não fazem parte de qualquer interface implementada pela área . Portanto, o compilador sintetiza uma interface para eles denominada, por padrão, < oClassName> . Se esse nome de interface já estiver em uso, o compilador acrescentará um sufixo de numeral inteiro (começando com 2), até que ele Localize um nome não utilizado.

No caso do MIDL acima, o compilador

  • sintetiza a interface IArea ,
  • Adiciona um exclusiveto atributo à interface sintetizada, especificando que a interface só pode ser referenciada pela classe de tempo de execução,
  • Especifica que a classe de tempo de execução implementa IAreae
  • torna a nova interface a interface padrão da classe de tempo de execução se a classe ainda não tiver uma interface padrão.

Portanto, o MIDL acima pode ser interpretado da seguinte maneira.

[exclusiveto(Area)]
interface IArea
{
    Int32 Height;
    Int32 Width;
}

runtimeclass Area : IArea, Windows.Foundation.IStringable
{
}

Membros estáticos

No exemplo a seguir, Area tem o membro estático NumberOfAreas.

runtimeclass Area : Windows.Foundation.IStringable
{
    static Int32 NumberOfAreas { get; };
}

O membro estático não faz parte de qualquer interface estática que a área implementa. Portanto, o compilador sintetiza uma interface para ela denominada, por padrão, < oClassName> é estático. Se esse nome de interface já estiver em uso, o compilador acrescentará um sufixo de numeral inteiro (começando com 2), até que ele Localize um nome não utilizado.

No caso do MIDL acima, o compilador

  • sintetiza a interface IAreaStatics ,
  • Adiciona um exclusiveto atributo à interface sintetizada, especificando que a interface só pode ser referenciada pela classe de tempo de execução e
  • Adiciona um statics atributo à classe Runtime, especificando que a fábrica de classes implementa IAreaStatics.

Portanto, o MIDL acima pode ser interpretado da seguinte maneira.

[exclusiveto(Area)]
interface IAreaStatics
{
    Int32 NumberOfAreas { get; };
}

[static(IAreaStatics)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Membros protegidos

No exemplo a seguir, Area tem o membro protegido doprotected.

runtimeclass Area : Windows.Foundation.IStringable
{
    protected void DoProtectedWork();
}

O membro protegido não faz parte de qualquer interface protegida que a área implementa. Portanto, o compilador sintetiza uma interface para ela denominada, por padrão, < aClassName> protegida. Se esse nome de interface já estiver em uso, o compilador acrescentará um sufixo de numeral inteiro (começando com 2), até que ele Localize um nome não utilizado.

No caso do MIDL acima, o compilador

  • sintetiza a interface IAreaProtected ,
  • Adiciona um exclusiveto atributo à interface sintetizada, especificando que a interface só pode ser referenciada pela classe de tempo de execução e
  • Adiciona um protected atributo à classe Runtime, especificando que a classe implementa a interface protegida IAreaProtected.

Portanto, o MIDL acima pode ser interpretado da seguinte maneira.

[exclusiveto(Area)]
interface IAreaProtected
{
    void DoProtectedWork();
}

[protected(IAreaProtected)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Membros substituíveis

No exemplo abaixo, o volume (que deriva de Area) tem o membro Overridable dooverridable.

runtimeclass Volume : Area
{
    overridable void DoOverridableWork();
}

O membro substituível não faz parte de qualquer interface substituível que a área implemente. Portanto, o compilador sintetiza uma interface para ela denominada, por padrão, < as substituições deClassName> . Se esse nome de interface já estiver em uso, o compilador acrescentará um sufixo de numeral inteiro (começando com 2), até que ele Localize um nome não utilizado.

No caso do MIDL acima, o compilador

  • sintetiza a interface IAreaOverrides ,
  • Adiciona um exclusiveto atributo à interface sintetizada, especificando que a interface só pode ser referenciada pela classe de tempo de execução e
  • Adiciona um overridable atributo à classe Runtime, especificando que a classe implementa a interface substituível IAreaOverrides.

Portanto, o MIDL acima pode ser interpretado da seguinte maneira.

[exclusiveto(Area)]
interface IAreaOverrides
{
    void DoOverridableWork();
}

[overridable(IAreaOverrides)]
runtimeclass Area : Windows.Foundation.IStringable
{
}