Share via


Síntesis de interfaces (MIDL 3.0)

Asignación de miembros a interfaces

Una Windows Runtime clase funciona en términos de interfaces. Sin embargo, las interfaces se mencionan en la mayoría de los ejemplos anteriores, porque suelen ser un detalle de implementación que no es necesario controlar en la mayoría de los casos.

Como resultado, cuando la descripción de la clase no hace referencia a una interfaz, sino cuando se necesita una para implementar la clase, el compilador de MIDL 3.0 sintetiza y agrega, según sea necesario.

Constructor predeterminado

Cuando se declara un constructor predeterminado como miembro de una clase, el compilador genera una Windows Runtime que es activable de forma predeterminada. En el nivel de implementación, esto significa que los metadatos describen la clase como activable predeterminada y el generador de clases para runtimeclass implementa la interfaz IActivationFactory .

runtimeclass Area
{
    Area();
    ...
}

En este caso, Area se compila con los metadatos [Activatable] con un tipo de null.

Constructores no predeterminados

Al declarar uno o varios constructores no predeterminados como miembros de una clase, el compilador genera una clase Windows Runtime que se puede activar, en lugar de activarse de forma predeterminada. En el nivel de implementación, esto significa que los metadatos describirán la clase como activable y especificarán la interfaz que contiene los métodos de constructor.

De forma predeterminada, esta interfaz se denomina IclassNameFactory>< y el generador de clases para runtimeclass implementa esa interfaz. Si este nombre de interfaz ya está en uso, el compilador anexa un sufijo numérico entero (empezando por 2), hasta que encuentra un nombre no utilizado.

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

En este caso, el compilador

  • sintetiza una interfaz de generador denominada IAreaFactory,
  • agrega un exclusiveto atributo a la interfaz sintetizada, especificando que la clase en tiempo de ejecución solo puede hacer referencia a la interfaz y
  • agrega un activatable atributo a la clase en tiempo de ejecución que indica que los clientes pueden usar miembros de interfaz IAreaFactory para crear instancias de la clase .

Por lo tanto, la MIDL anterior se puede interpretar de esta manera.

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

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

Una clase puede contener un constructor predeterminado y constructores adicionales no predeterminados.

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

En ese caso, midl se puede interpretar de esta manera; con ambas formas del activatable atributo.

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

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

Miembros de instancia

En el ejemplo siguiente, Área tiene miembros Height y Width.

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

Esos miembros no forman parte de ninguna interfaz que Area implemente. Por lo tanto, el compilador sintetiza una interfaz para ellos denominada, de forma predeterminada, IclassName><. Si este nombre de interfaz ya está en uso, el compilador anexa un sufijo numérico entero (empezando por 2), hasta que encuentra un nombre no utilizado.

En el caso de midl anterior, el compilador

  • sintetiza la interfaz IArea ,
  • agrega un exclusiveto atributo a la interfaz sintetizada, especificando que la clase en tiempo de ejecución solo puede hacer referencia a la interfaz.
  • especifica que la clase en tiempo de ejecución implementa IArea y
  • convierte la nueva interfaz en la interfaz predeterminada para la clase en tiempo de ejecución si la clase aún no tiene una interfaz predeterminada.

Por lo tanto, la MIDL anterior se puede interpretar de esta manera.

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

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

Miembros estáticos

En el ejemplo siguiente, Area tiene el miembro estático NumberOfAreas.

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

El miembro estático no forma parte de ninguna interfaz estática que implementa Area . Por lo tanto, el compilador sintetiza una interfaz para ella denominada, de forma predeterminada, IclassNameStatics><. Si este nombre de interfaz ya está en uso, el compilador anexa un sufijo numérico entero (empezando por 2), hasta que encuentra un nombre no utilizado.

En el caso de midl anterior, el compilador

  • sintetiza la interfaz IAreaStatics ,
  • agrega un exclusiveto atributo a la interfaz sintetizada, especificando que la clase en tiempo de ejecución solo puede hacer referencia a la interfaz y
  • agrega un statics atributo a la clase en tiempo de ejecución, especificando que el generador de clases implementa IAreaStatics.

Por lo tanto, la MIDL anterior se puede interpretar de esta manera.

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

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

Miembros protegidos

En el ejemplo siguiente, Area tiene el miembro protegido DoProtectedWork.

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

El miembro protegido no forma parte de ninguna interfaz protegida que area implemente. Por lo tanto, el compilador sintetiza una interfaz para ella denominada, de forma predeterminada, IclassNameProtected><. Si este nombre de interfaz ya está en uso, el compilador anexa un sufijo numérico entero (empezando por 2), hasta que encuentra un nombre no utilizado.

En el caso de midl anterior, el compilador

  • sintetiza la interfaz IAreaProtected ,
  • agrega un exclusiveto atributo a la interfaz sintetizada, especificando que la clase en tiempo de ejecución solo puede hacer referencia a la interfaz y
  • agrega un protected atributo a la clase en tiempo de ejecución, especificando que la clase implementa la interfaz protegida IAreaProtected.

Por lo tanto, la MIDL anterior se puede interpretar de esta manera.

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

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

Miembros reemplazables

En el ejemplo siguiente, Volume (que deriva de Area) tiene el miembro reemplazable DoOverridableWork.

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

El miembro reemplazable no forma parte de ninguna interfaz reemplazable que area implemente. Por lo tanto, el compilador sintetiza una interfaz para ella denominada, de forma predeterminada, IclassNameOverrides><. Si este nombre de interfaz ya está en uso, el compilador anexa un sufijo numérico entero (empezando por 2), hasta que encuentra un nombre no utilizado.

En el caso de midl anterior, el compilador

  • sintetiza la interfaz IAreaOverrides ,
  • agrega un exclusiveto atributo a la interfaz sintetizada, especificando que la clase en tiempo de ejecución solo puede hacer referencia a la interfaz y
  • agrega un overridable atributo a la clase en tiempo de ejecución, especificando que la clase implementa la interfaz reemplazable IAreaOverrides.

Por lo tanto, la MIDL anterior se puede interpretar de esta manera.

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

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