Sintesi di interfacce (MIDL 3.0)

Assegnazione di membri alle interfacce

Una Windows Runtime funziona in termini di interfacce. Tuttavia, le interfacce sono state appena citate nella maggior parte degli esempi precedenti, perché sono in genere un dettaglio di implementazione che non è necessario controllare nella maggior parte dei casi.

Di conseguenza, quando la descrizione della classe non fa altrimenti riferimento a un'interfaccia, ma quando ne è necessaria una per implementare la classe, il compilatore MIDL 3.0 esegue la sintesi e le aggiunge, se necessario.

Costruttore predefinito

Quando si dichiara un costruttore predefinito come membro di una classe, il compilatore produce Windows Runtime classe attivabile predefinita. A livello di implementazione, ciò significa che i metadati descrivono la classe come attivabile predefinita e il class factory per la classe runtime implementa l'interfaccia IActivationFactory .

runtimeclass Area
{
    Area();
    ...
}

In questo caso, Area viene compilato con i metadati [Activatable] con un tipo di null.

Costruttori non predefiniti

Quando si dichiarano uno o più costruttori non predefiniti come membri di una classe, il compilatore produce una classe Windows Runtime attivabile, anziché attivabile per impostazione predefinita. A livello di implementazione, ciò significa che i metadati descrivono la classe come attivabile e specificano l'interfaccia contenente i metodi del costruttore.

Per impostazione predefinita, questa interfaccia è denominata IclassNameFactory>< e il class factory per la classe runtime implementa tale interfaccia. Se questo nome di interfaccia è già in uso, il compilatore aggiunge un suffisso numerico intero (a partire da 2) fino a individuare un nome non usato.

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

In questo caso, il compilatore

  • sintetizza un'interfaccia factory denominata IAreaFactory,
  • aggiunge un exclusiveto attributo all'interfaccia sintetizzata, specificando che è possibile fare riferimento all'interfaccia solo dalla classe di runtime e
  • aggiunge un activatable attributo alla classe di runtime che indica che i client possono usare i membri dell'interfaccia IAreaFactory per creare istanze della classe.

Il codice MIDL precedente può quindi essere interpretato in questo modo.

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

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

Una classe può contenere sia un costruttore predefinito che costruttori aggiuntivi non predefiniti.

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

In tal caso, MIDL può essere interpretato in questo modo. con entrambe le forme dell'attributo activatable .

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

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

Membri di istanza

Nell'esempio seguente , Area ha membri Height e Width.

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

Questi membri non fanno parte di alcuna interfaccia implementata da Area . Il compilatore sintetizza quindi un'interfaccia denominata, per impostazione predefinita, IclassName><. Se questo nome di interfaccia è già in uso, il compilatore aggiunge un suffisso numerico intero (a partire da 2) fino a individuare un nome non usato.

Nel caso del linguaggio MIDL precedente, il compilatore

  • sintetizza l'interfaccia IArea ,
  • aggiunge un exclusiveto attributo all'interfaccia sintetizzata, specificando che l'interfaccia può essere referenziata solo dalla classe di runtime,
  • specifica che la classe di runtime implementa IArea e
  • rende la nuova interfaccia l'interfaccia predefinita per la classe di runtime se la classe non ha già un'interfaccia predefinita.

Il codice MIDL precedente può quindi essere interpretato in questo modo.

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

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

Membri statici

Nell'esempio seguente , Area ha il membro statico NumberOfAreas.

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

Il membro statico non fa parte di alcuna interfaccia statica implementata da Area . Il compilatore sintetizza quindi un'interfaccia denominata, per impostazione predefinita, IclassNameStatics><. Se questo nome di interfaccia è già in uso, il compilatore aggiunge un suffisso numerico intero (a partire da 2) fino a individuare un nome non usato.

Nel caso del linguaggio MIDL precedente, il compilatore

  • sintetizza l'interfaccia IAreaStatics ,
  • aggiunge un exclusiveto attributo all'interfaccia sintetizzata, specificando che è possibile fare riferimento all'interfaccia solo dalla classe di runtime e
  • aggiunge un statics attributo alla classe di runtime, specificando che il class factory implementa IAreaStatics.

Il codice MIDL precedente può quindi essere interpretato in questo modo.

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

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

Membri protetti

Nell'esempio seguente Area ha il membro protetto DoProtectedWork.

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

Il membro protetto non fa parte di alcuna interfaccia protetta implementata da Area . Il compilatore sintetizza quindi un'interfaccia denominata, per impostazione predefinita, IclassNameProtected><. Se questo nome di interfaccia è già in uso, il compilatore aggiunge un suffisso numerico intero (a partire da 2) fino a individuare un nome non usato.

Nel caso del linguaggio MIDL precedente, il compilatore

  • sintetizza l'interfaccia IAreaProtected ,
  • aggiunge un exclusiveto attributo all'interfaccia sintetizzata, specificando che è possibile fare riferimento all'interfaccia solo dalla classe di runtime e
  • aggiunge un protected attributo alla classe di runtime, specificando che la classe implementa l'interfaccia protetta IAreaProtected.

Il codice MIDL precedente può quindi essere interpretato in questo modo.

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

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

Membri sottoponibili a override

Nell'esempio seguente , Volume (che deriva da Area) ha il membro sottoponibile a override DoOverridableWork.

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

Il membro sottoponibile a override non fa parte di alcuna interfaccia sottoponibile a override implementata da Area . Il compilatore sintetizza quindi un'interfaccia denominata, per impostazione predefinita, IclassNameOverrides><. Se questo nome di interfaccia è già in uso, il compilatore aggiunge un suffisso numerico intero (a partire da 2) fino a individuare un nome non usato.

Nel caso del linguaggio MIDL precedente, il compilatore

  • sintetizza l'interfaccia IAreaOverrides ,
  • aggiunge un exclusiveto attributo all'interfaccia sintetizzata, specificando che è possibile fare riferimento all'interfaccia solo dalla classe di runtime e
  • aggiunge un overridable attributo alla classe di runtime, specificando che la classe implementa l'interfaccia sottoponibile a override IAreaOverrides.

Il codice MIDL precedente può quindi essere interpretato in questo modo.

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

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