一、特质(trait)
-
Scala中没有接口(interface)的概念
-
特质用于在类之间共享程序接口和字段,类似Java接口
-
特质是字段和方法的集合,可以提供字段和方法实现
-
类和单例对象都可以扩展特质(extends)
-
特质不能被实例化,因此没有构造参数,类似Java接口
-
特质使用“trait”关键字定义
-
实现特质中的方法使用“override”
二、混入特质(mixin)
-
当某个特质被用于组合类时,被称为混入
-
一个类只能有一个父类但是可以有多个混入(分别使用关键字extends和with)
trait Type1{
def wheele:String= "四轮驱动"
def run():Unit
}
trait Type2{
def fly()= println("可以飞")
def down()= println("下海")
}
//定义抽象类
abstract class Car {
def brand:String
def engine:String
def didi():String ={
"汽车鸣笛"
}
}
//实现类 混入特质
class BMW extends Car with Type1 {
override def brand: String = {
"德系宝马"
}
override def engine: String = {
"6.0自然吸气,燃油动力"
}
override def run(): Unit = {
println("在路上跑")
}
}
class LingYun extends Car {
override def brand: String = "凌云汽车"
override def engine: String = "纯电动汽车"
}
object test{
def main(args: Array[String]): Unit = {
val bmw=new BMW
println(bmw.brand)
println(bmw.engine)
println(bmw.didi())
println(bmw.wheele)
bmw.run()
//动态混入特质
val lingYun:LingYun=new LingYun with Type1 with Type2{
override def run(): Unit = {
println("两轮电动汽车")
}
}
println(lingYun.brand)
println(lingYun.engine)
lingYun.run()
lingYun.fly()
lingYun.down()
}
}
三、特质与抽象类的选择
-
优先使用特质
1.抽象类只能继承一次
2.特质可混入多个 -
需要使用带参构造方法时,使用抽象类
-
与Java互操作性
1.抽象类与Java完全可互操作
2.特质只有在不包含任何实现代码时才可互操作