我不明白如何使用继承来模拟genericy,我正在查阅Bertand Meyer的文章“Genericity vs. Inheritance”,但我仍然不理解它。我会更清楚地解释一下。
答案 0 :(得分:1)
在某些编程语言中,您可以使用带有抽象类型成员的继承来模拟genericy。 这是一个使用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来理解这篇文章。 编辑:引用一句话: 至少在原理上,我们可以将各种参数化表达为面向对象的抽象形式。 希望有所帮助
答案 1 :(得分:1)
只有静态类型语言(或带有类型提示的语言)才需要泛型 - 因为你不想失去那种难以获得的类型安全性。
如果你的(静态)语言没有它们,那么可能是时候考虑不同的了 - 模拟使用继承是丑陋的黑客。
或更好 - 考虑动态语言和测试驱动开发。你将获得更多的权力(一切都是通用的,不需要打字),测试将代表你的合同 - 包括具体的例子 - 即使是最好的类型安全的抽象根本无法做到的。 (因为它是抽象的)
答案 2 :(得分:0)
在一般情况下,你不能这样做。这就是为什么OO语言已经添加了模板和泛型等内容。例如,在引入模板之前在C ++中创建通用容器的所有尝试都已失败或几乎完全无法使用。