【问题标题】:Generic interface overloading. Valid terminology?通用接口重载。有效的术语?
【发布时间】:2012-12-06 07:49:50
【问题描述】:

这是一个非常基本的方法重载示例,两个方法名称相同但签名不同:

int MyMethod(int a)
int MyMethod(int a, string b)

现在假设我定义了两个通用接口,共享完全相同的名称但类型参数数量不同,例如:

IMyInterface<T>
IMyInterface<T1,T2>

我可以说这代表“通用接口重载”吗?还是“重载”术语仅适用于这种情况下的方法?它看起来仍然与方法重载非常相似,因为我们保持完全相同的名称但参数不同。

如果我不能说“通用接口重载/重载”,对于这两个共享相同名称的不同接口我能说什么?

感谢和抱歉,如果这是一个愚蠢的问题,但谷歌搜索“通用接口重载”或“通用接口重载”并没有给我太多,而是关于接口方法重载的结果,这不是我感兴趣的。

【问题讨论】:

  • 我会选择“通用类型参数重载”。也许“过载”是不正确的术语。可能需要用不同的方式来描述它。
  • 我称之为语义。只要人们知道你在说什么,它叫什么并不重要。
  • 不是答案,但我想你会喜欢阅读这个答案:stackoverflow.com/a/4876693/151445
  • 如果您阅读 MSDN 上的 Tuple 类 (msdn.microsoft.com/en-us/library/system.tuple.aspx),它从不使用特定术语。实际上,它倾向于将不同的版本称为不同的类型。但是,它也通过引用它们的“组件”来区分它们。因此,也许在引用您的泛型类型时,您可以使用诸如“具有 2 个组件的 MyMethod 类型”或“具有 1 个组件的 MyMethod 类型”之类的语言?

标签: c# overloading terminology generic-interface


【解决方案1】:

具有相同名称但泛型类型参数数量不同(包括零)的类型只是不同的类型。术语“重载”在这里不适用。重载实际上只适用于属于同一类型且具有相同名称但不同签名的方法。


拥有同名的泛型和非泛型接口是很常见的(来自 .NET 库的示例):

public interface IList : ICollection, IEnumerable

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable

它们只是被称为泛型和非泛型。


泛型类型的 .NET 名称是以重音符 (&grave;) 结尾的类型名称和类型参数的数量。例如 C# 中的 IMyType&lt;T&gt; 或 VB 中的 IMyType(Of T) 类型被翻译为

IMyType`1

内部。 &lt;T&gt; 实际上只是一个 C# 语法结构,它被转换为 CLR 使用的内部 .NET 名称。

IMyType&lt;T,U&gt; 会被翻译成

IMyType`2

这清楚地表明,在 C# 中具有相同名称的类型仅在泛型类型参数的数量上有所不同,在 (CLR-) 实际类型中具有不同的名称。

【讨论】:

  • +1 同意,name 和 name 最好考虑为 TYPE1 和 TYPE2
  • +1。谢谢(可能很快就会标记为已回答)。这是有道理的,因为说这些接口只是不同的不同类型是正确的。我不明白的是,当你说“同一类型的方法”时……方法不是类型,它没有真正的意义(但我不知何故明白你的意思)虽然我同意这两个接口都是不同的类型,它们共享一个相似的名称,在我看来应该有一个特定的术语,以指出这一事实和这些接口的特定“关系”。我们应该在哪里请求新术语? :)
  • 我的意思是属于同一类型。对困惑感到抱歉。 (更正)
  • 感谢您的澄清和对您答案的额外编辑。
  • 已回答!仍然希望能够使用特定术语而不是仅仅“不同”来谈论这些以某种方式相关的接口。事实上,当我在我的代码中添加一个与另一个名称完全相同但类型参数不同的通用接口时,我意识到了这一点,我试图弄清楚为我的代码提交写什么注释。我不能说“为 IMyInterface 添加了重载”,然后我会说“添加了新的 IMyInterface 类型”……看到此提交的人可能会认为这是一个全新的接口(确实如此,但并非如此; ))。
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 2012-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多