【发布时间】:2011-09-14 11:34:30
【问题描述】:
我不明白如何使用继承来模拟泛型,我正在查阅 Bertand Meyer 的文章“Genericity vs Inheritance”,但我仍然不明白。我希望得到更清晰的解释。
【问题讨论】:
标签: oop generics inheritance
我不明白如何使用继承来模拟泛型,我正在查阅 Bertand Meyer 的文章“Genericity vs Inheritance”,但我仍然不明白。我希望得到更清晰的解释。
【问题讨论】:
标签: oop generics inheritance
在一般情况下,您不能这样做。这就是为什么 OO 语言添加了模板和泛型之类的东西。例如,在引入模板之前,所有在 C++ 中创建通用容器的尝试都失败了,或者几乎完全无法使用。
【讨论】:
在某些编程语言中,您可以使用带有抽象类型成员的继承来模拟泛型。 这是一个使用 scala 的示例。即使你不知道 scala 也应该可以理解。
class Collection {
type T;
//all methods are using T for the contained type.
}
我不确定,但在 c++ 中类型是 typedef。 按照这种方法,您可以通过对集合进行子类型化并将 T 类型指定为 A,从而获得具有 A 类型元素的集合:
class IntCollection extends Collection {
type T = Int;
//...
}
此解决方案在泛型或模板方面存在一些缺点,但也提供了一些好处。 如果您有兴趣,请考虑阅读以下内容:http://www.artima.com/weblogs/viewpost.jsp?thread=270195 scala 中的抽象类型成员与通用类型参数。 同样,您不必了解 scala 即可理解该帖子。 编辑:仅引用一句话: 至少在原则上,我们可以将每一种参数化表达为一种面向对象的抽象形式。 希望对您有所帮助
【讨论】:
仅在静态类型语言(或带有类型提示的语言)中才需要泛型 - 因为您不想失去难以获得的类型安全性。
如果您的(静态)语言没有它们,那么可能是时候考虑不同的语言了 - 使用继承进行模拟是丑陋的 hack。
或者更好 - 考虑动态语言和测试驱动开发。您将获得更多的权力(一切都是通用的,无需键入)并且测试将代表您的合同 - 包括具体示例 - 这是即使是最好的类型安全抽象也无法做到的。 (因为它是抽象的)
【讨论】: