Scala 的特质

Scala 的特质

特质是 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.如果还不知道怎么办,就先开始使用特质吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GettingReal

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值