使用抽象类而不是trait的优势是什么(除了性能)?在大多数情况下,抽象类似乎可以被特征所取代。


当前回答

一个类可以继承多个特征,但只能继承一个抽象类。 抽象类可以有构造函数形参和类型形参。trait只能有类型参数。例如,你不能说trait t(i: Int) {};参数I不合法。 抽象类与Java完全可互操作。您可以从Java代码中调用它们,而不需要任何包装器。trait只有在不包含任何实现代码的情况下才完全可互操作。

其他回答

一个类可以继承多个特征,但只能继承一个抽象类。 抽象类可以有构造函数形参和类型形参。trait只能有类型参数。例如,你不能说trait t(i: Int) {};参数I不合法。 抽象类与Java完全可互操作。您可以从Java代码中调用它们,而不需要任何包装器。trait只有在不包含任何实现代码的情况下才完全可互操作。

无论如何,Odersky等人在《Scala编程》一书中建议,当你怀疑时,就使用trait。如果需要,您可以随时将它们更改为抽象类。

我能想到两个不同点

抽象类可以有构造函数形参和类型形参。trait只能有类型参数。有一些讨论说,将来甚至trait也可以有构造函数形参 抽象类与Java完全可互操作。您可以从Java代码中调用它们,而不需要任何包装器。trait只有在不包含任何实现代码的情况下才完全可互操作

在Programming Scala中,作者说抽象类构成了典型的面向对象的“is-a”关系,而特征则是一种Scala组合方式。

抽象类可以包含行为——它们可以用构造函数参数化(trait不能)并表示一个工作实体。trait只是代表一个单一的特性,一个功能的界面。