美文网首页
Scala的特质(Traits)

Scala的特质(Traits)

作者: Grits | 来源:发表于2018-03-16 13:58 被阅读0次

Key Words: thin interfaces, rich interfaces, stackable modifications

特质是 Scala 重用代码的基础单元。特质可以封装方法和字段定义,通过混入(mix in)到相关的类,来达到复用的目的。和类的单继承不同的是,一个类可以混入多个特质

特质

可以像定义类来定义特质,只是需要将关键字 class 换成 trait

trait Foo {
  // ...
}

细节

1.如果特质在定义时,没有指定超类,那么默认是AnyRef
2.特质中的方法可以是抽象的(abstract),也可以是具体的(concrete)
3.使用extends or with关键字将特质混入类中
4.一个类混入一个特质,可以在该类中使用override重写该特质的成员
5.特质不能含有任何类参数
6.类中的super调用时静态绑定(bound)的,而特质中是动态绑定的
7.如果一个特质继承自某个特定的类,那么该特质只能混入该特定类或者该特定类的扩展类
8.如果一个类使用extends混入一个特质,那么该类默认继承该特质的超类
9.特质可以作为一个类型来进行使用,如下

trait Foo
class Bar extends Foo
val foo: Foo = new Bar

瘦接口和富接口

富接口含有多个方法,为调用者带来便利;瘦接口含有很少的方法,为实现带来便利

Scala 中的特质可以包含具体方法,所以为实现富接口带来便利
向特质中添加具体方法,就会将此特质从瘦接口向富接口倾斜

可堆叠修改(Stackable Modifications)

通俗的来讲,在特质中使用super关键字来调用超类的方法,就能产生类似于责任链模式的调用方式

线性化(linearization)

在线性化中,一个类总是在所有的超类和混入的特质之前被线性化

一个可堆叠修改的触发,编译器在背后总是进行线性化的操作,线性化的操作是从类本身开始,再从扩展类以及混入特质最右端,按照既定的规则,形成线性化的网络图,如下图所示:

个人对于线性化的简短概述:从类本身开始,然后从最右端特质进行继承层级分析,逐级合并继承网状拓扑的操作

特质的使用建议

1.如果一个行为不需要被重用,定义成具体的类
2.如果可能被多个不相关的类使用,定义成特质
3.如果想被 Java 代码继承,定义成抽象类
4.如果打算以编译的形式发布,且期望外部继承它,使用抽象类比较合适
5.如果还不知道怎么办,就先开始使用特质吧

相关文章

网友评论

      本文标题:Scala的特质(Traits)

      本文链接:https://www.haomeiwen.com/subject/afazfftx.html