【问题标题】:What is the OverloadAttribute used for?重载属性有什么用?
【发布时间】:2013-01-24 16:27:58
【问题描述】:

所以在设计 API 时,我发现 Javascript 和重载以及所有有趣的东西存在一些问题。我认为可能有帮助的一件事是OverloadAttribute。不过,这个问题的原因是我找不到任何关于它的作用的文档。 MSDN 提供了非常有用的信息

在支持的语言中将该方法标识为重载 重载。

显然,我需要更多信息。那么,这究竟是用来做什么的呢?构造函数的string method参数是干什么用的?

【问题讨论】:

    标签: javascript .net windows-runtime overloading windows-store-apps


    【解决方案1】:

    如文档所示,OverloadAttribute 供不支持重载的语言使用。例如,考虑使用 IDL 和 C++(不是 C++/CX)在 ABI 层编写 Windows 运行时代码。在 IDL 中,不能重载接口函数:接口的每个函数都必须有不同的名称。

    让我们看一个例子。这是 Windows.Foundation.idl 文件中IUriRuntimeClassFactory 的定义,您可以在 Windows 8 SDK 中找到该文件:

    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);
    }
    

    这两个接口函数在 IDL 中以不同的名称声明。这两个函数都使用 IDL overload 属性进行注释。该属性告诉 IDL 编译器这两个成员函数逻辑上都是CreateUri的重载。

    midlrt IDL 编译器从该 IDL 生成 WinMD 文件时,它将交换重载名称和接口函数名称,以便在元数据中,这两个接口函数的名称都为 CreateUri,并且两个函数都具有OverloadAttribute 以原始名称应用于它们(CreateUri 用于第一个,CreateWithRelativeUri 用于第二个)。您可以通过使用 ildasm 查看参考 Windows.winmd 中的元数据来观察这一点。

    当您从 WinMD 生成 IDL 时,会发生反向转换:使用 OverloadAttribute 注释的接口函数使用该属性提供的名称命名。这允许 IDL 和 WinMD 之间的无损往返。

    【讨论】:

    • 所以基本上,它在 C++/IDL 之外没用?
    • 这是使用它的一个例子。不过,任何其他语言投影都可以使用重载信息。
    • 这似乎不起作用。我有[Overload("Foo")]void FooBar(string x)[Overload("Foo")]void FooBang(SomeClass x) 并得到一个编译器错误multiple overloads of Foo have the same overload name "Foo", specified by using Windows.Foundation.Metadata.OverloadAttribute
    • 好吧,你的例子是倒退的。在 C++/CX 和 .NET 投影(C# 和 VB.NET)中,映射是直接的:源中函数的实际名称是元数据中函数名称所使用的名称。 OverloadAttribute 中的字符串只是存储在属性中,供不支持重载(如 IDL/C++)的消费者使用。
    • 请注意,“上面描述的 Foo 是 NOT 合法的。Windows 运行时重载必须因 arity(“in”参数的数量)而不同,上述两种 Foo 方法具有相同的arity,所以它们是非法的。
    猜你喜欢
    • 2010-11-12
    • 2013-08-08
    • 2014-09-12
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多