合成介面 (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
{
}