【大纲】
【正文】
1.【结论】应用场景
现有一个父类Animal{name; age; eat();},子类Monkey,子类Cat。Monkey后来学会了play(),拥有了star成员变量,但是需要在在不影响袁继承体系和类的前提下,让Monkey拥有play()和star。就可以定义一个特质trait,star和play()做特质的成员,Monkey再继承特质
2.【结论】作用
0.提高代码复用性
1.解耦、提高扩展性和可维护性
3.【结论】语法
0.定义特质
trait 特质名{
普通字段
抽象字段
普通方法
抽象方法
}
1.继承特质
class/object 类名 extends 特质A with 特质B{
重写抽象字段
重写抽象方法
...
}
# 注意:
1.scala特质中,可以有普通字段、普通方法、抽象字段、抽象方法。当然,特质中也可以只有普通成员,或只有抽象成员
2.只有抽象成员的特质叫瘦接口;既有抽象成员又有普通成员的特质叫富接口
3.类可多继承trait,一个类继承多个trait就叫叠加特质
4.类必须重写所有trait的抽象成员
示例
# 类继承单特质
object Trait {
// 定义特质
trait Logger{
val name:String = "im log"
val length:Int
def log(msg:String)
}
// 定义类继承特质
class ConsoleLogger extends Logger{
// 重写特质所有抽象成员
override val length: Int = 5
override def log(msg: String): Unit = {
println(msg)
}
}
def main(args: Array[String]): Unit = {
val logger = new ConsoleLogger
logger.log("im here") // 效果:im here
}
}
# 类继承多个特质
object Trait {
// 定义特质1
trait MessageSender{
def send(msg:String)
}
// 定义特质2
trait MessageReceiver{
def receive
}
// 定义类继承多个特质
class MessageWorker extends MessageSender with MessageReceiver{
// 重写所有抽象方法
override def send(msg: String): Unit = {
println("发送:" + msg)
}
override def receive: Unit = {
println("消息已收到")
}
}
def main(args: Array[String]):