本文共 1416 字,大约阅读时间需要 4 分钟。
- Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明。
- Scala中的trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质。这种感觉类似于Java中的抽象类。
- Scala引入trait特征,第一可以替代Java的接口,第二个也是对单继承机制的一种补充。
trait 特质名 { trait主体}
- 基本语法:一个类具有某种特质(特征),就意味着这个类满足了这个特质(特征)的所有要素,所以在使用时,也采用了extends关键字,如果有多个特质或存在父类,那么需要采用with关键字连接。
- 特质继承使用
没有父类:class 类名 extends 特质1 with 特质2 with 特质3 …有父类:class 类名 extends 父类 with 特质1 with 特 质2 with 特质3…
- 动态混入
- 特质常规冲突:一个类(Sub)混入的两个trait(TraitA,TraitB)中具有相同的具体方法,且两个trait之间没有任何关系,解决这类冲突问题,直接在类(Sub)中重写冲突方法。
- 特质混入冲突(特质叠加):一个类(Sub)混入的两个trait(TraitA,TraitB)中具有相同的具体方法,且两个trait继承自相同的trait(TraitC),及所谓的“钻石问题”,解决这类冲突问题,Scala采用了特质叠加的策略(将混入的多个trait中的冲突方法叠加起来)。
- 特质叠加顺序:如果想要调用某个指定的混入特质中的方法,可以增加约束:super[],例如super[Operation].describe()。
1. 列出混入的第一个特质一级继承关系,作为临时的叠加顺序(谁继承在前,谁在前面) DBOperation ---> Operation2. 列出混入的第二个特质一级继承关系,加入临时的叠加顺序(重复的特质不再加入) HDFSOperation ---> DBOperation ---> Operation3. 将子类放到临时叠加顺序的前面 MyOperation ---> HDFSOperation ---> DBOperation ---> Operation4. 在特质叠加的环境中,super关键字表示下一个特质 MyOperation is ----> 向HDFS中向MySQL中插入数据
- 特质自身注入:自身类型可实现依赖注入的功能。
- 特质和抽象的区别
1. 抽象类中可以定义抽象属性,抽象方法,非抽象属性,非抽象方法2. 特质中可以3. 抽象类和特质都不能实例化,且都有主构造 方法4. 优先选择特质,scala语言是单继承,如果继承抽象类扩展不方便5. 如果需要构造方法传递参数,使用抽象类,因为抽象类的构造方法中,可以定义带参数构造,但是特质中不允许6. 一般子类和父类之间满足“is-a”原则,使用抽象类7. 特质一般是对行为进行抽象,定义规范
- 类型检查
- 枚举类和应用类
- Type定义新类型:使用type关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名(String底层源也是用的type调用的java.lang.String)
转载地址:http://atzhn.baihongyu.com/