什么是Smalltalk中的“无界动态多态”

时间:2012-02-15 15:07:34

标签: polymorphism smalltalk

Smalltalk中的“无界动态多态”是什么?有人可以提供一个例子吗?

在此book C ++模板中提及:完整指南,p。 238。

3 个答案:

答案 0 :(得分:6)

See 在c ++中: 通过继承实现的多态性是有界的和动态的:

  • 有界意味着参与多态行为的类型的接口是由公共基类的设计预先确定的(这个概念的其他术语是侵入性的或侵入性的)。
  • 动态意味着接口的绑定在运行时(动态)完成。

通过模板实现的多态性是无限的和静态的:

  • 无界意味着参与多态行为的类型的接口不是预先确定的(此概念的其他术语是非侵入性的或非侵入性的。)
  • 静态意味着接口的绑定在编译时完成(静态)。

在Smalltalk中,对象可以决定是否以及如何对在运行时发送的消息做出反应。

答案 1 :(得分:1)

在C ++中,您在对象上调用的方法是在编译时决定的。对于非虚拟方法,这是一个简单的方法,对于虚拟调用,它是通过vtable查找完成的。但是,虚拟调用(它们是多态性的地方)的关键在于编译器已经确定调用该方法是有效的,并且它知道要使用的vtable中的哪个条目。在

在Smalltalk中,调用在运行时解决。被调用的对象的类型可以在调用之间变化,因此正确的方法(可能已被覆盖)不能在编译时绑定(未绑定的位),并且必须在运行时解析(动态位)。

答案 2 :(得分:1)

unbounded dynamic polymorphism不是特定于语言的功能。所以我假设你的问题

  

Smalltalk中的“无界动态多态”是什么?

可以简化为

  

什么是“无界动态多态”?

您在提到的文档中对此进行了解释。 我想你是在问为什么使smalltalk成为一种无限的动态多态语言? 首先,我不赞成绑定与未绑定这一术语。这个定义对我来说并不清楚。

例如假设我有一个模板类A,如果你选择将它实例化为A<int>它被绑定,那么这里没有不确定的东西。即使对于A类,接口也是预先确定的。我要说的是模板是一种在Haskell类型系统中具有多态类型的方式。

我认为使用术语未绑定/绑定的结果是什么是多态性的定义不佳。多态性可以应用于类型或接口。

多态接口是一种可以实现选择不同行为的接口。例如,对象abc都可以以不同的方式响应Copy界面。

多态类型是具有参数的类型。

正如你所看到的,多态接口和多态类型是两件不相关的东西。

另外,为了对C ++和smalltalk进行分类,我会说C ++是一种具有多态类型的静态类型语言。而smalltalk是一种动态类型的语言。并且它不需要多态类型系统,因为多态类型只在静态类型语言中是明智的。