Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何使用继承来模拟泛型?_Oop_Generics_Inheritance - Fatal编程技术网

Oop 如何使用继承来模拟泛型?

Oop 如何使用继承来模拟泛型?,oop,generics,inheritance,Oop,Generics,Inheritance,我不理解如何使用继承来模拟泛型,我正在查阅Bertand Meyer的文章“泛型与继承”,但我仍然不理解它。我希望有一个更清楚的解释。在一般情况下,你不能这样做。这就是为什么OO语言中添加了模板和泛型之类的东西。例如,在模板引入之前,所有试图在C++中创建通用容器的方法都是失败的,或者几乎完全不可用。 < P>在某些编程语言中,可以使用继承类型与抽象类型成员模拟通用性。 下面是一个使用scala的示例。即使你不了解scala,也应该可以理解 class Collection { type T;

我不理解如何使用继承来模拟泛型,我正在查阅Bertand Meyer的文章“泛型与继承”,但我仍然不理解它。我希望有一个更清楚的解释。

在一般情况下,你不能这样做。这就是为什么OO语言中添加了模板和泛型之类的东西。例如,在模板引入之前,所有试图在C++中创建通用容器的方法都是失败的,或者几乎完全不可用。

< P>在某些编程语言中,可以使用继承类型与抽象类型成员模拟通用性。 下面是一个使用scala的示例。即使你不了解scala,也应该可以理解

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不知道-但这不是一般意义上的泛型。