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
{
}