说明
trait可以定义 抽象属性、抽象方法,也可以定义 普通属性、普通方法
相当于 java中的 抽象类
应用场景
Array 的 foreach() 方法,就在 trait 中定义的,如下:
作用
- 主要是 声明方法,相当于 制定规范、标准
- 弥补单继承的缺点
类比
android手机流行前的功能机时代,不同手机厂商的手机,充电口互不通用,导致十分混乱
trait 相当于 USB接口,通过制定 USB接口规范,其他厂家按照该规范生产制造USB接口,符合USB接口的设备,都可以 充电 或 传输数据,达到 通用 的目的
定义 trait
trait 名字{
}
例子
定义 USB
trait USB{
/**
* 定义普通属性
*/
var version = "3.0"
/**
* 定义抽象属性
*/
var name:String
/**
* 可以定义抽象方法
*/
def chongdian():Unit
/**
* 可以定义普通方法
*/
def chuanshu():Unit = {
println("传输数据完成")
}
}
定义 Zhiwen
//指纹识别接口
trait Zhiwen{
//识别
def shibie():Boolean
}
使用trait
没有父类
class 类名 extends 特质 1 with 特质 2 …{
}
说明:
类和特质的关系:继承 的关系。
当一个类去继承特质时,第一个连接词是
extends,后面是with
有父类
class 类名 extends 父类 with 特质 1 with 特质 2 …{
}
说明: 如果一个类在同时 继承 特质 和 父类 时,应当把父类写在 extends 后,把特质 写在 with 后
例子
trait USB{
/**
* 定义普通属性
*/
var version = "3.0"
/**
* 定义抽象属性
*/
var name:String
/**
* 可以定义抽象方法
*/
def chongdian():Unit
/**
* 可以定义普通方法
*/
def chuanshu():Unit = {
println("传输数据完成")
}
}
trait Zhiwen{
def shibie():Boolean
}
实现类:
class Android extends USB with Zhiwen {
//非抽象类,必须要给抽象属性赋值
var name: String = "USB快充"
override def chongdian(): Unit = {
println(s"使用 ${name} 充电完成")
}
override def shibie(): Boolean = true
}
测试:
def main(args: Array[String]): Unit = {
val xiaomi=new Android
println(s"USB名: ${xiaomi.name}")
println(s"USB版本: ${xiaomi.version}")
xiaomi.chongdian()
xiaomi.chuanshu()
val res = xiaomi.shibie()
println(s"识别结果:$res")
}

