合成接口 (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
{
}