抽象类与特质之间的区别

可能重复:
斯卡拉的特质与抽象类

抽象类和特征之间的概念区别是什么?

一个类只能扩展一个超类 ,因此只能有一个抽象类。 如果你想编写几个类,Scala的方法是使用mixin类组合 :你可以将一个(可选的)超类,你自己的成员定义和一个或多个特性组合起来 。 与类相比,特性受到限制,因为它不能有构造函数参数(比较scala参考手册 )。

介绍了与类相比特征的限制,以避免多inheritance的典型问题。 关于inheritance层次,规则或多或less是复杂的。 这可能是最好的,以避免实际上很重要的层次结构。 ;-)据我所知,只有当你从两个不同的性状inheritance了两个具有相同签名/两个variables同名的方法时,

性状的一个方面是它们是可堆叠的 。 允许AOP的约束forms(围绕build议)。

trait A{ def a = 1 } trait X extends A{ override def a = { println("X") super.a } } trait Y extends A{ override def a = { println("Y") super.a } } scala> val xy = new AnyRef with X with Y xy: java.lang.Object with X with Y = $anon$1@6e9b6a scala> xy.a Y X res0: Int = 1 scala> val yx = new AnyRef with Y with X yx: java.lang.Object with Y with X = $anon$1@188c838 scala> yx.a X Y res1: Int = 1 

super的parsing反映了inheritance层次的线性化。

从概念上讲,特质是类的组成部分,而不是类本身。 因此,它通常没有build设者,并不意味着“自立”。

我build议在具有独立意义的时候使用抽象类,并且当你只是想以面向对象的方式添加function的时候就会有特点。 如果你不确定这两者之间的关系 ,你可能会发现,如果你所有的方法都围绕着一个单一的东西,你可能需要一个特质。

对于非语言特定的示例,如果您的员工应该同时扩展“Person”和“Cloneable”,则为Person创build一个基类,并克隆一个特性。

至less在Scala中,特征系统有一个明确的方法来在子类中声明父优先级,以避免与多inheritance相关的典型问题,即与具有相同签名的inheritance方法的冲突。

特性类似于Java接口,但允许有方法实现。

Interesting Posts