合成介面 (MIDL 3.0)
將成員指派給介面
Windows 執行階段類別會以介面來運作。 不過,大部分上述範例中都未提及介面,因為它們通常是您在大部分情況下都不需要控制的實作細節。
如此一來,當您的類別描述未以其他方式參考介面時,就會視需要使用 MIDL 3.0 編譯器會合成並新增它們。
預設建構函式
當您將預設的程式聲明宣告為類別的成員時,編譯器會產生預設為可啟動的 Windows 執行階段類別。 在執行層級上,這表示中繼資料會將類別描述為預設可啟動,而 runtimeclass 的 class factory 會實 IActivationFactory 介面。
runtimeclass Area
{
Area();
...
}
在此情況下,會使用類型null
為的中繼資料 [Activatable]
來編譯區域。
(s 的非預設的函式)
當您將一或多個非預設的函式宣告為類別的成員時,編譯器會產生可啟動的 Windows 執行階段類別,而不是預設為可啟動的。 在執行層級上,這表示中繼資料會將類別描述為可啟動,並指定包含函式方法的介面。
根據預設,這個介面會命名為 I <className> Factory,而 runtimeclass 的 class factory 會執行該介面。 如果這個介面名稱已在使用中,則編譯器會附加一個整數數位後置字元, (從 2) 開始,直到找到未使用的名稱為止。
runtimeclass Area
{
Area(Int32 width, Int32 height);
...
}
在此情況下,編譯器
- 會合成名為 IAreaFactory的 factory 介面,
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
{
...
}
執行個體成員
在下列範例中, 區域 具有成員的 高度 和 寬度。
runtimeclass Area : Windows.Foundation.IStringable
{
Int32 Height;
Int32 Width;
}
這些成員不屬於 區域 所實行的任何介面。 因此,根據預設, <> 編譯器會為它們會合成一個名為的介面。 如果這個介面名稱已在使用中,則編譯器會附加一個整數數位後置字元, (從 2) 開始,直到找到未使用的名稱為止。
在上述 MIDL 的情況下,編譯器
- 會合成 IArea 介面,
exclusiveto
將屬性新增至合成介面,指定介面只能由執行時間類別參考,- 指定執行時間類別會執行 IArea,並
- 如果類別還沒有預設介面,則讓新介面成為執行時間類別的預設介面。
因此,上述 MIDL 可以像這樣來解讀。
[exclusiveto(Area)]
interface IArea
{
Int32 Height;
Int32 Width;
}
runtimeclass Area : IArea, Windows.Foundation.IStringable
{
}
靜態成員
在下列範例中, 區域 具有靜態成員 NumberOfAreas。
runtimeclass Area : Windows.Foundation.IStringable
{
static Int32 NumberOfAreas { get; };
}
靜態成員不是 區域 所執行之任何靜態介面的一部分。 因此,編譯器會會合成其名為的介面,預設為我 < 的className> 靜態。 如果這個介面名稱已在使用中,則編譯器會附加一個整數數位後置字元, (從 2) 開始,直到找到未使用的名稱為止。
在上述 MIDL 的情況下,編譯器
- 會合成 IAreaStatics 介面,
exclusiveto
將屬性新增至合成介面,指定介面只能由執行時間類別參考,而statics
將屬性加入至執行時間類別,指定 class factory 會執行IAreaStatics。
因此,上述 MIDL 可以像這樣來解讀。
[exclusiveto(Area)]
interface IAreaStatics
{
Int32 NumberOfAreas { get; };
}
[static(IAreaStatics)]
runtimeclass Area : Windows.Foundation.IStringable
{
}
Protected 成員
在下列範例中, 區域 有受保護的成員 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();
}
可覆寫的成員不是 區域 所執行之任何可覆寫介面的一部分。 因此,編譯器會會合成名為的介面,預設 >< 會覆寫類別。 如果這個介面名稱已在使用中,則編譯器會附加一個整數數位後置字元, (從 2) 開始,直到找到未使用的名稱為止。
在上述 MIDL 的情況下,編譯器
- 會合成 IAreaOverrides 介面,
exclusiveto
將屬性新增至合成介面,指定介面只能由執行時間類別參考,而overridable
將屬性加入至執行時間類別,並指定該類別會執行可覆寫的介面IAreaOverrides。
因此,上述 MIDL 可以像這樣來解讀。
[exclusiveto(Area)]
interface IAreaOverrides
{
void DoOverridableWork();
}
[overridable(IAreaOverrides)]
runtimeclass Area : Windows.Foundation.IStringable
{
}