特质(trait)
Scala中没有接口(interface)的概念
特质用于在类之间共享程序接口和字段,类似Java接口
特质是字段和方法的集合,可以提供字段和方法实现
类和单例对象都可以扩展特质(extends)
特质不能被实例化,因此没有构造参数,类似Java接口
特质使用“trait”关键字定义
实现特质中的方法使用“override”
混入特质(mixin)
当某个特质被用于组合类时,被称为混入
一个类只能有一个父类但是可以有多个混入(分别使用关键字extends和with)
案例:
注:构造顺序由左往右,如果前面已经构造了某个父类,后面子类的该父类不会重复构造
动态混入特质
案例
package nj.zb.kb09.oop
//特质
trait Type1{
def wheele:String={
"有四个轮子"
}
def run():Unit
}
trait Type2{
def fly():Unit={
println("可以飞")
}
def downSea():Unit={
println("下海")
}
}
abstract class Car {
def brand:String
def engine:String
def didi():String={
"汽车鸣笛滴滴滴"
}
}
class BMW extends Car with Type1 with Type2 {
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 DemoCar{
def main(args: Array[String]): Unit = {
val bWM =new BMW
println(bWM.brand)
println(bWM.engine)
println(bWM.didi())
println(bWM.wheele)
bWM.run()
//动态混入特质
val lingYun:LingYun with Type1 with Type2= new LingYun with Type1 with Type2 {
override def run(): Unit = {
println("两个轮子的电动汽车")
}
}
lingYun.run()
lingYun.fly()
println(lingYun.brand)
println(lingYun.engine)
}
}
特质与抽象类的选择
- 1、优先使用特质
抽象类只能继承一次
特质可混入多个 - 2、需要使用带参构造方法时,使用抽象类
- 3、与Java互操作性
抽象类与Java完全可互操作
特质只有在不包含任何实现代码时才可互操作