合成接口 (MIDL 3.0)
将成员分配到接口
Windows 运行时类在接口方面进行操作。 但在大多数情况下,上述示例中几乎提到了接口,因为它们通常是一个实现细节,在大多数情况下不需要进行控制。
因此,当类说明不以其他方式引用接口时,但当需要实现类时,MIDL 3.0 编译器合成并添加它们(如有必要)。
默认构造函数
将默认构造函数声明为类的成员时,编译器将生成一个默认可激活的 Windows 运行时类。 在实现级别,这意味着元数据将类描述为默认可激活,而 runtimeclass 的类工厂实现 IActivationFactory 接口。
runtimeclass Area
{
Area();
...
}
在这种情况下,使用类型为的 null
元数据 [Activatable]
编译区域。
(s 的非默认构造函数)
将一个或多个非默认构造函数声明为类的成员时,编译器将生成一个可激活的 Windows 运行时类,而不是默认的可激活类。 在实现级别,这表示元数据将类描述为可激活,并指定包含构造函数方法的接口。
默认情况下,此接口名为 I <className> Factory,runtimeclass 的类工厂实现了该接口。 如果此接口名称已在使用,则编译器将追加一个整数数字后缀, (从 2) 开始,直到它找到未使用的名称。
runtimeclass Area
{
Area(Int32 width, Int32 height);
...
}
在这种情况下,编译器
- 合成名为 IAreaFactory的工厂接口,
exclusiveto
向合成接口添加特性,指定仅可由运行时类引用该接口,并- 向运行时类添加一个
activatable
特性,指示客户端可以使用 IAreaFactory 接口成员创建类的实例。
因此,可以按如下所示解释上述 MIDL。
[exclusiveto(Area)]
interface IAreaFactory
{
Area(Int32 width, Int32 height);
}
[activatable(IAreaFactory)]
runtimeclass Area
{
...
}
类可以同时包含默认构造函数和其他非默认构造函数。
runtimeclass Area
{
Area();
Area(Int32 width, Int32 height);
...
}
在这种情况下,可按如下所示解释 MIDL:特性的 activatable
两种形式。
[exclusiveto(Area)]
interface IAreaFactory
{
Area(Int32 width, Int32 height);
}
[activatable()]
[activatable(IAreaFactory)]
runtimeclass Area
{
...
}
实例成员
在下面的示例中, Area 包含成员的 高度 和 宽度。
runtimeclass Area : Windows.Foundation.IStringable
{
Int32 Height;
Int32 Width;
}
这些成员不是 区域 所实现的任何接口的一部分。 因此,编译器会为其合成一个接口,默认情况下,I <类> 。 如果此接口名称已在使用,则编译器将追加一个整数数字后缀, (从 2) 开始,直到它找到未使用的名称。
对于上述 MIDL,编译器
- 合成 IArea 接口,
exclusiveto
向合成接口添加特性,并指定该接口只能由运行时类引用,- 指定运行时类实现 IArea,并
- 如果类尚不具有默认接口,则使新接口成为运行时类的默认接口。
因此,可以按如下所示解释上述 MIDL。
[exclusiveto(Area)]
interface IArea
{
Int32 Height;
Int32 Width;
}
runtimeclass Area : IArea, Windows.Foundation.IStringable
{
}
静态成员
在下面的示例中, Area 包含了静态成员 NumberOfAreas。
runtimeclass Area : Windows.Foundation.IStringable
{
static Int32 NumberOfAreas { get; };
}
静态成员不是 区域 实现的任何静态接口的一部分。 因此,编译器会将其命名为合成,默认情况下,I <类> 静态。 如果此接口名称已在使用,则编译器将追加一个整数数字后缀, (从 2) 开始,直到它找到未使用的名称。
对于上述 MIDL,编译器
- 合成 IAreaStatics 接口,
exclusiveto
向合成接口添加特性,指定仅可由运行时类引用该接口,并statics
将特性添加到运行时类,同时指定类工厂实现IAreaStatics。
因此,可以按如下所示解释上述 MIDL。
[exclusiveto(Area)]
interface IAreaStatics
{
Int32 NumberOfAreas { get; };
}
[static(IAreaStatics)]
runtimeclass Area : Windows.Foundation.IStringable
{
}
受保护的成员
在下面的示例中, Area 具有受保护的成员 DoProtectedWork。
runtimeclass Area : Windows.Foundation.IStringable
{
protected void DoProtectedWork();
}
受保护的成员不是 区域 实现的任何受保护接口的一部分。 因此,编译器会为其合成一个名为的接口,默认情况下, <类> 受保护。 如果此接口名称已在使用,则编译器将追加一个整数数字后缀, (从 2) 开始,直到它找到未使用的名称。
对于上述 MIDL,编译器
- 合成 IAreaProtected 接口,
exclusiveto
向合成接口添加特性,指定仅可由运行时类引用该接口,并protected
将特性添加到运行时类,同时指定类实现受保护的接口IAreaProtected。
因此,可以按如下所示解释上述 MIDL。
[exclusiveto(Area)]
interface IAreaProtected
{
void DoProtectedWork();
}
[protected(IAreaProtected)]
runtimeclass Area : Windows.Foundation.IStringable
{
}
可重写成员
在下面的示例中,从区域) 派生的卷 (具有可重写的成员DoOverridableWork。
runtimeclass Volume : Area
{
overridable void DoOverridableWork();
}
可重写成员不是 区域 实现的任何可重写接口的一部分。 因此,编译器会为其合成一个名为的接口,默认情况下,I <类> 替代。 如果此接口名称已在使用,则编译器将追加一个整数数字后缀, (从 2) 开始,直到它找到未使用的名称。
对于上述 MIDL,编译器
- 合成 IAreaOverrides 接口,
exclusiveto
向合成接口添加特性,指定仅可由运行时类引用该接口,并overridable
将特性添加到运行时类,同时指定类实现可重写的接口IAreaOverrides。
因此,可以按如下所示解释上述 MIDL。
[exclusiveto(Area)]
interface IAreaOverrides
{
void DoOverridableWork();
}
[overridable(IAreaOverrides)]
runtimeclass Area : Windows.Foundation.IStringable
{
}