Oop 如何使用继承来模拟泛型?
我不理解如何使用继承来模拟泛型,我正在查阅Bertand Meyer的文章“泛型与继承”,但我仍然不理解它。我希望有一个更清楚的解释。在一般情况下,你不能这样做。这就是为什么OO语言中添加了模板和泛型之类的东西。例如,在模板引入之前,所有试图在C++中创建通用容器的方法都是失败的,或者几乎完全不可用。 < P>在某些编程语言中,可以使用继承类型与抽象类型成员模拟通用性。 下面是一个使用scala的示例。即使你不了解scala,也应该可以理解Oop 如何使用继承来模拟泛型?,oop,generics,inheritance,Oop,Generics,Inheritance,我不理解如何使用继承来模拟泛型,我正在查阅Bertand Meyer的文章“泛型与继承”,但我仍然不理解它。我希望有一个更清楚的解释。在一般情况下,你不能这样做。这就是为什么OO语言中添加了模板和泛型之类的东西。例如,在模板引入之前,所有试图在C++中创建通用容器的方法都是失败的,或者几乎完全不可用。 < P>在某些编程语言中,可以使用继承类型与抽象类型成员模拟通用性。 下面是一个使用scala的示例。即使你不了解scala,也应该可以理解 class Collection { type T;
class Collection {
type T;
//all methods are using T for the contained type.
}
我不确定,但C++类型是TyPulf。
按照这种方法,您可以通过对集合进行子类型化并将类型T指定给a来获得具有类型a的元素的集合:
class IntCollection extends Collection {
type T = Int;
//...
}
这种解决方案与泛型或模板相比有一些缺点,但也有一些好处。
如果你感兴趣的话,请考虑阅读以下内容:http://www.artima.com/weblogs/viewpost.jsp?thread=270195
scala中的抽象类型成员与泛型类型参数。
同样,你不必了解scala就能理解这篇文章。
编辑:仅引用一句话:
至少在原则上,我们可以将各种参数化表示为一种面向对象的抽象形式。
希望只有在静态类型语言(或具有类型暗示的语言)中才需要有帮助的泛型,因为您不想失去难以获得的类型安全性 如果您的(静态)语言没有它们,那么可能是时候考虑另一种了——使用继承进行模拟是一种丑陋的黑客行为
或者更好——考虑动态语言和测试驱动开发。您将获得更多的功能(一切都是通用的,不需要键入),测试将代表您的契约——包括具体的示例——这是即使是最好的类型安全抽象也无法做到的。(因为它是抽象的)如果我使用指向基类的指针来总结其派生类的功能,会发生什么?@two\d不知道-但这不是一般意义上的泛型。