1

Donc, lors de la conception d'une API, j'ai trouvé quelques problèmes avec Javascript et les surcharges et tous ces trucs amusants. Une chose que je pense peut aider est le OverloadAttribute. La raison de cette question est que je ne trouve aucune documentation sur ce que cela fait. MSDN donne des informations très utilesA quoi sert OverloadAttribute?

identifie la méthode comme une surcharge dans une langue qui prend en charge la surcharge .

De toute évidence, j'ai besoin d'un peu plus d'informations que cela. Alors, à quoi cela sert-il exactement? À quoi sert le paramètre string method du constructeur?

Répondre

0

Comme la documentation l'indique, le code OverloadAttribute doit être utilisé par les langues qui ne prennent pas en charge la surcharge. Par exemple, pensez à écrire du code Windows Runtime sur la couche ABI en utilisant IDL et C++ (pas C++/CX). Dans IDL, vous ne pouvez pas surcharger les fonctions d'interface: chaque fonction d'une interface doit avoir un nom différent.

Jetons un coup d'œil à un exemple. Voici la définition de IUriRuntimeClassFactory du fichier Windows.Foundation.idl, que vous pouvez trouver dans le SDK Windows 8:

interface IUriRuntimeClassFactory : IInspectable 
{ 
    [overload("CreateUri")] HRESULT CreateUri([in] HSTRING uri, [out] [retval] Windows.Foundation.Uri** instance); 
    [overload("CreateUri")] HRESULT CreateWithRelativeUri([in] HSTRING baseUri, [in] HSTRING relativeUri, [out] [retval] Windows.Foundation.Uri** instance); 
} 

Les deux fonctions d'interface sont déclarées avec des noms différents dans IDL. Les deux fonctions sont annotées avec l'attribut IDL overload. Cet attribut indique au compilateur IDL que ces deux fonctions membres sont logiquement surcharges de CreateUri. Lorsque le compilateur IDL midlrt génère un fichier WinMD à partir de cet IDL, il échange le nom de la surcharge et le nom de la fonction d'interface afin que, dans les métadonnées, ces deux fonctions portent le nom CreateUri et que les deux fonctions aient le même nom. OverloadAttribute appliqué à eux avec le nom d'origine (CreateUri pour le premier, et CreateWithRelativeUri pour le second). Vous pouvez observer ceci en regardant les métadonnées dans la référence Windows.winmd en utilisant ildasm.

Lorsque vous générez IDL à partir d'un WinMD, la transformation inverse se produit: les fonctions d'interface qui sont annotées avec OverloadAttribute sont nommées en utilisant le nom fourni par cet attribut. Cela permet un déclenchement sans perte entre IDL et WinMD.

+0

Donc, fondamentalement, il est inutile en dehors de C++/IDL? – Earlz

+0

C'est un exemple d'où il est utilisé. Toute autre projection de langue pourrait utiliser l'information de surcharge, cependant. –

+0

Cela ne semble pas fonctionner. J'ai '[Overload (" Foo ")] void FooBar (string x)' et '[Overload (" Foo ")] void FooBang (SomeClass x)' et obtient une erreur de compilation 'plusieurs surcharges de Foo ont le même nom de surcharge "Foo", spécifié en utilisant Windows.Foundation.Metadata.OverloadAttribute' – Earlz