【发布时间】:2014-01-16 20:02:30
【问题描述】:
我正在阅读一些关于不同编程语言中模板之间差异的问题。我明白这主要归功于这个问题:What are the differences between Generics in C# and Java... and Templates in C++?。然而,当他开始谈论接口和添加一些东西时,我在接受的答案结束时确实有点困惑。我主要从这个问题中了解接口的一般情况:Explaining Interfaces to Students。我仍然对问题中所说的内容感到困惑。那么有人可以更好地解释最后一部分:
因此,C++ 编译器对您可以使用模板执行的操作没有任何限制 - 基本上是您可以手动编写的任何代码, 你可以得到模板来为你写。最明显的例子是 添加东西:
在 C# 和 Java 中,泛型系统需要知道什么是方法 可用于类,它需要将其传递给虚拟 机器。告诉它的唯一方法是通过硬编码 实际类中或使用接口。例如:
string addNames( T first, T second ) { return first.Name() + 第二个名字(); }
该代码不会在 C# 或 Java 中编译,因为它不知道 T 类型实际上提供了一个名为 Name() 的方法。你必须告诉 它 - 在 C# 中是这样的:
interface IHasName{ string Name(); };字符串 addNames( T first, T 第二 ) 其中 T : IHasName { .... }
然后你必须确保你传递给 addNames 的东西 实现 IHasName 接口等等。 java语法是 不同的(),但它受到相同的影响 问题。
这个问题的“经典”案例是尝试编写一个函数 这是做什么的
string addNames( T first, T second ) { return first + second; }
您实际上无法编写此代码,因为没有办法 声明一个带有 + 方法的接口。你失败了。
C++ 没有这些问题。编译器不在乎 关于将类型传递给任何虚拟机——如果你的两个对象都有 .Name() 函数,它将编译。如果他们不这样做,就不会。很简单。
我真的很想理解这个答案中的代码,因为我很困惑 .Name() 方法如何在 IHasName 接口中工作。有人有更好的例子可以进一步解释如何使用接口向 Person 类或其他内容添加名称等内容...
编辑:我对 Java 代码更感兴趣。
【问题讨论】: