在Scala中,子类型多态的替代方案是什么?

15

我对scala中替代子类型多态的完整方案很感兴趣。

1个回答

23

实现Scala中静态可检测多态的基本工具有:

  • 子类型化(普通的OO多态)
  • 类型参数化(允许多态的变量性和约束条件)
  • 自类型化(允许限制和专门化OO多态)
  • 隐式转换(允许事后多态构造)
  • 结构类型(允许基于特征而不是类型的多态)
  • 一般类型边界(允许对允许多态的精确约束)
  • 模式匹配(允许基于数据结构的多态,类似于抽象数据类型)
  • 高级类型化(允许对多态构造进行多态化)

称所有这些为“替代方案”可能是一个错误的词,因为它们已经非常紧密地集成在一起。使用这些工具之一或者几个相结合来表达某些多态算法并不罕见。

值得注意的是,在Scala多态中for-comprehensions的位置。 for-comprehensions似乎并不特别多态化。在表面下,for-comprehensions只是调用filter / map / flatMap的语法糖,并且那些方法的实现往往是高度多态的。因此,看起来相对简单的for循环可以产生一些非常令人印象深刻的多态效果。


3
从类型系统的角度看,行为是一种不透明的属性,因此更准确地描述结构类型应该是“基于值的特征”,而不是“基于值的行为”。 - Randall Schulz
2
我在你的列表中想念“更高级类型的支持”,这是Scala最强大的功能之一。我认为最好的参考仍然是Adrian Moors的论文:http://people.cs.kuleuven.be/~adriaan.moors/files/higher.pdf - Landei
1
优秀的注释。编辑。 - Dave Griffith
1
你忘记了类型类。事实上,我认为除了子类型化之外,多态的另外两种选择是结构类型和类型类。其余的要么是对子类型化的增强(泛型、约束),要么与之无关。 - IttayD
在Scala中,类型类主要是通过隐式转换来实现的,这就是为什么我没有明确地将其分离出来。这当然符合我的隐式转换描述,因为它允许事后多态。我不确定您如何认为泛型是子类型化的增强。人们可以很容易地想象出具有泛型但没有子类型化的语言(如果我没记错的话,早期版本的Ada遵循了这种模式)。 - Dave Griffith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接