インターフェイスの合成 (MIDL 3.0)
インターフェイスへのメンバーの割り当て
Windows ランタイムクラスは、インターフェイスを使用して動作します。 これらのインターフェイスは、ほとんどの場合に制御する必要がない実装の詳細であるため、上記のほとんどの例ではほとんど説明しませんでした。
その結果、クラスの説明がインターフェイスを参照しない場合は、クラスを実装するために必要なときに MIDL 3.0 コンパイラによって合成され、必要に応じて追加されます。
既定のコンストラクター
既定のコンストラクターをクラスのメンバーとして宣言すると、コンパイラによって、既定のアクティブ化可能な Windows ランタイムクラスが生成されます。 実装レベルでは、メタデータはクラスを既定のアクティブ化可能として記述し、runtimeclass のクラスファクトリは IActivationFactory インターフェイスを実装します。
runtimeclass Area
{
Area();
...
}
この場合、領域は、型の null
メタデータ [Activatable]
を使用してコンパイルされます。
既定以外のコンストラクター
1つ以上の既定以外のコンストラクターをクラスのメンバーとして宣言すると、コンパイラは、既定のアクティブ化可能なのではなく、アクティブ化可能な 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 <className> という名前のインターフェイスを合成します。 このインターフェイス名が既に使用されている場合、コンパイラは未使用の名前を見つけるまで整数の数字のサフィックス (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 <className> という名前のインターフェイスを合成します。 このインターフェイス名が既に使用されている場合、コンパイラは未使用の名前を見つけるまで整数の数字のサフィックス (2 から始まる) を追加します。
上記の MIDL の場合、コンパイラは
- 合成は、 Iの静的 インターフェイスを
exclusiveto
合成されたインターフェイスに属性を追加し、そのインターフェイスがランタイムクラスによってのみ参照可能であることを指定します。- 属性を
statics
ランタイムクラスに追加し、クラスファクトリが Iの静的スタティックを実装するように指定します。
そのため、上記の MIDL は、次のように解釈できます。
[exclusiveto(Area)]
interface IAreaStatics
{
Int32 NumberOfAreas { get; };
}
[static(IAreaStatics)]
runtimeclass Area : Windows.Foundation.IStringable
{
}
プロテクト メンバー
次の例では、 Area に Protected メンバー DoProtectedWorkが含まれています。
runtimeclass Area : Windows.Foundation.IStringable
{
protected void DoProtectedWork();
}
保護されたメンバーは、その 領域 が実装する保護されたインターフェイスの一部ではありません。 そのため、コンパイラは、という名前のインターフェイスを合成します。既定では、I <className> は保護されています。 このインターフェイス名が既に使用されている場合、コンパイラは未使用の名前を見つけるまで整数の数字のサフィックス (2 から始まる) を追加します。
上記の MIDL の場合、コンパイラは
- i合成 protectedインターフェイスを
exclusiveto
合成されたインターフェイスに属性を追加し、そのインターフェイスがランタイムクラスによってのみ参照可能であることを指定します。- 属性を
protected
ランタイムクラスに追加し、クラスが保護されたインターフェイス I、保護されたインターフェイスを実装するように指定します。
そのため、上記の MIDL は、次のように解釈できます。
[exclusiveto(Area)]
interface IAreaProtected
{
void DoProtectedWork();
}
[protected(IAreaProtected)]
runtimeclass Area : Windows.Foundation.IStringable
{
}
オーバーライド可能なメンバー
次の例では、( Areaから派生した) Volumeがオーバーライド可能なメンバー DoOverridableWorkを持っています。
runtimeclass Volume : Area
{
overridable void DoOverridableWork();
}
オーバーライド可能なメンバーは、その 領域 が実装するオーバーライド可能なインターフェイスの一部ではありません。 そのため、コンパイラは、既定で I <className> オーバーライドという名前のインターフェイスを合成します。 このインターフェイス名が既に使用されている場合、コンパイラは未使用の名前を見つけるまで整数の数字のサフィックス (2 から始まる) を追加します。
上記の MIDL の場合、コンパイラは
- 合成 Iのオーバーライド インターフェイスを
exclusiveto
合成されたインターフェイスに属性を追加し、そのインターフェイスがランタイムクラスによってのみ参照可能であることを指定します。overridable
属性をランタイムクラスに追加し、クラスがオーバーライド可能なインターフェイスIのオーバーライドを実装するように指定します。
そのため、上記の MIDL は、次のように解釈できます。
[exclusiveto(Area)]
interface IAreaOverrides
{
void DoOverridableWork();
}
[overridable(IAreaOverrides)]
runtimeclass Area : Windows.Foundation.IStringable
{
}