Synthetisieren von Schnittstellen (MIDL 3.0)

Zuweisen von Membern zu Schnittstellen

Eine Windows-Runtime-Klasse arbeitet im Hinblick auf Schnittstellen. Schnittstellen wurden in den meisten der vorherigen Beispiele jedoch nur selten erwähnt, da sie in der Regel ein Implementierungsdetail sind, das Sie in den meisten Fällen nicht steuern müssen.

Daher wird der MIDL 3.0-Compiler bei Bedarf synthetisiert und hinzufügt, wenn ihre Klassenbeschreibung andernfalls nicht auf eine Schnittstelle verweist – aber wenn eine schnittstelle zum Implementieren der Klasse erforderlich ist.

Standardkonstruktor

Wenn Sie einen Standardkonstruktor als Member einer Klasse deklarieren, erzeugt der Compiler eine Windows-Runtime Klasse, die standardmäßig aktivierbar ist. Auf Implementierungsebene bedeutet dies, dass die Metadaten die -Klasse als standardverwertbar beschreiben und die Klassenfactory für die Runtimeklasse die IActivationFactory-Schnittstelle implementiert.

runtimeclass Area
{
    Area();
    ...
}

In diesem Fall wird Area mit den Metadaten [Activatable] mit dem Typnullkompiliert.

Nicht standardmäßige Konstruktoren

Wenn Sie einen oder mehrere nicht standardmäßige Konstruktoren als Member einer Klasse deklarieren, erzeugt der Compiler eine Windows-Runtime Klasse, die aktivierbar ist und nicht standardmäßig aktivierbar ist. Auf Implementierungsebene bedeutet dies, dass die Metadaten die -Klasse als aktivierbar beschreiben und die Schnittstelle angeben, die die Konstruktormethoden enthält.

Standardmäßig heißt diese Schnittstelle IclassNameFactory><, und die Klassenfactory für die Runtimeklasse implementiert diese Schnittstelle. Wenn dieser Schnittstellenname bereits verwendet wird, fügt der Compiler ein ganzzahliges Zahlensuffix an (beginnend mit 2), bis ein nicht verwendeter Name gefunden wird.

runtimeclass Area
{
    Area(Int32 width, Int32 height);
    ...
}

In diesem Fall ist der Compiler

  • synthetisiert eine Factoryschnittstelle mit dem Namen IAreaFactory,
  • fügt der synthetisierten Schnittstelle ein exclusiveto Attribut hinzu, das angibt, dass auf die Schnittstelle nur von der Laufzeitklasse verwiesen werden kann, und
  • fügt der Laufzeitklasse ein activatable Attribut hinzu, das angibt, dass Clients IAreaFactory-Schnittstellenmember verwenden können, um Instanzen der -Klasse zu erstellen.

Daher kann die oben genannte MIDL wie folgt interpretiert werden.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Eine Klasse kann sowohl einen Standardkonstruktor als auch zusätzliche nicht standardmäßige Konstruktoren enthalten.

runtimeclass Area
{
    Area();
    Area(Int32 width, Int32 height);
    ...
}

In diesem Fall kann die MIDL wie folgt interpretiert werden. mit beiden Formen des activatable Attributs.

[exclusiveto(Area)]
interface IAreaFactory
{
    Area(Int32 width, Int32 height);
}

[activatable()]
[activatable(IAreaFactory)]
runtimeclass Area
{
    ...
}

Instanzmember

Im folgenden Beispiel weist Area die Elemente Height und Width auf.

runtimeclass Area : Windows.Foundation.IStringable
{
    Int32 Height;
    Int32 Width;
}

Diese Member sind nicht Teil einer Schnittstelle, die Area implementiert. Daher synthetisiert der Compiler standardmäßig eine Schnittstelle mit dem Namen IclassName><. Wenn dieser Schnittstellenname bereits verwendet wird, fügt der Compiler ein ganzzahliges Zahlensuffix an (beginnend mit 2), bis ein nicht verwendeter Name gefunden wird.

Im Fall der obigen MIDL wird der Compiler

  • synthetisiert die IArea-Schnittstelle ,
  • fügt der synthetisierten Schnittstelle ein exclusiveto Attribut hinzu, das angibt, dass auf die Schnittstelle nur von der Laufzeitklasse verwiesen werden kann.
  • gibt an, dass die Laufzeitklasse IArea implementiert, und
  • macht die neue Schnittstelle zur Standardschnittstelle für die Laufzeitklasse, wenn die Klasse noch nicht über eine Standardschnittstelle verfügt.

Daher kann die oben genannte MIDL wie folgt interpretiert werden.

[exclusiveto(Area)]
interface IArea
{
    Int32 Height;
    Int32 Width;
}

runtimeclass Area : IArea, Windows.Foundation.IStringable
{
}

Statische Member

Im folgenden Beispiel weist Area das statische Element NumberOfAreas auf.

runtimeclass Area : Windows.Foundation.IStringable
{
    static Int32 NumberOfAreas { get; };
}

Der statische Member ist nicht Teil einer statischen Schnittstelle, die Area implementiert. Daher synthetisiert der Compiler dafür standardmäßig eine Schnittstelle namens IclassNameStatics><. Wenn dieser Schnittstellenname bereits verwendet wird, fügt der Compiler ein ganzzahliges Zahlensuffix an (beginnend mit 2), bis ein nicht verwendeter Name gefunden wird.

Im Fall der obigen MIDL wird der Compiler

  • synthetisiert die IAreaStatics-Schnittstelle ,
  • fügt der synthetisierten Schnittstelle ein exclusiveto Attribut hinzu, das angibt, dass auf die Schnittstelle nur von der Laufzeitklasse verwiesen werden kann, und
  • fügt der Laufzeitklasse ein statics Attribut hinzu, das angibt, dass die Klassenfactory IAreaStatics implementiert.

Daher kann die oben genannte MIDL wie folgt interpretiert werden.

[exclusiveto(Area)]
interface IAreaStatics
{
    Int32 NumberOfAreas { get; };
}

[static(IAreaStatics)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Geschützte Member

Im folgenden Beispiel weist Area den geschützten Member DoProtectedWork auf.

runtimeclass Area : Windows.Foundation.IStringable
{
    protected void DoProtectedWork();
}

Der geschützte Member ist nicht Teil einer geschützten Schnittstelle, die Von Area implementiert wird. Daher synthetisiert der Compiler standardmäßig eine Schnittstelle mit dem Namen IclassNameProtected><. Wenn dieser Schnittstellenname bereits verwendet wird, fügt der Compiler ein ganzzahliges Zahlensuffix an (beginnend mit 2), bis ein nicht verwendeter Name gefunden wird.

Im Fall der obigen MIDL wird der Compiler

  • synthetisiert die IAreaProtected-Schnittstelle ,
  • fügt der synthetisierten Schnittstelle ein exclusiveto Attribut hinzu, das angibt, dass auf die Schnittstelle nur von der Laufzeitklasse verwiesen werden kann, und
  • fügt der Laufzeitklasse ein protected Attribut hinzu, das angibt, dass die Klasse die geschützte Schnittstelle IAreaProtected implementiert.

Daher kann die oben genannte MIDL wie folgt interpretiert werden.

[exclusiveto(Area)]
interface IAreaProtected
{
    void DoProtectedWork();
}

[protected(IAreaProtected)]
runtimeclass Area : Windows.Foundation.IStringable
{
}

Überschreibbare Member

Im folgenden Beispiel weist Volume (das von Area abgeleitet wird) den überschreibbaren Member DoOverridableWork auf.

runtimeclass Volume : Area
{
    overridable void DoOverridableWork();
}

Der überschreibbare Member ist nicht Teil einer überschreibbaren Schnittstelle, die Area implementiert. Daher synthetisiert der Compiler standardmäßig eine Schnittstelle mit dem Namen IclassNameOverrides><. Wenn dieser Schnittstellenname bereits verwendet wird, fügt der Compiler ein ganzzahliges Zahlensuffix an (beginnend mit 2), bis ein nicht verwendeter Name gefunden wird.

Im Fall der obigen MIDL wird der Compiler

  • synthetisiert die IAreaOverrides-Schnittstelle ,
  • fügt der synthetisierten Schnittstelle ein exclusiveto Attribut hinzu, das angibt, dass auf die Schnittstelle nur von der Laufzeitklasse verwiesen werden kann, und
  • fügt der Laufzeitklasse ein overridable Attribut hinzu, das angibt, dass die Klasse die überschreibbare Schnittstelle IAreaOverrides implementiert.

Daher kann die oben genannte MIDL wie folgt interpretiert werden.

[exclusiveto(Area)]
interface IAreaOverrides
{
    void DoOverridableWork();
}

[overridable(IAreaOverrides)]
runtimeclass Area : Windows.Foundation.IStringable
{
}