提示
特质可以为类提供堆叠的改变,要什么功能,混入不同的特质
特点
定义一个父接口,实现一个基础功能。
然后针对这个基础实现在扩展出多种增强实现,在创建对象时,通过with不断混入需要的特质,可以在基础功能上应用所有混入的功能
trait LoggerTrait {
//日志统一接口
def log(msg:String):Unit
}
//子特质可以实现父特质的方法
trait ConsoleLogger extends LoggerTrait{
override def log(msg: String): Unit = {
println(s"在控制台打印日志:$msg")
}
}
//增强记录日志方法,可以记录带有时间戳的日志
trait TimeStampLogger extends ConsoleLogger{
//在控制台打印的的日志带有时间戳,可以调用java的对象
override def log(msg:String): Unit = {
super.log(s"${java.time.Instant.now()}$msg")
}
}
//日志截取功能
trait ShortterLogger extends ConsoleLogger{
val maxLength = 15
override def log(msg: String): Unit = {
if(msg.length <= maxLength) super.log(msg)
else
super.log(s"${msg.substring(0,maxLength-1)}...")
}
}
//定义一个对象,希望给对象增加记录日志的方法
class Account {
protected var balance:Double = 0.0
}
class SavingAccount extends Account with ConsoleLogger{
//class SavingAccount extends Account with TimeStampLogger{
//class SavingAccount extends Account with ShortterLogger{
def withdraw(amount:Double):Unit = {
if(amount>balance)
log("钱不够")
else
this.balance -= amount
}
}
object APP extends App {
val acc1 = new SavingAccount();
acc1.withdraw(100);
//动态的混入
//在创建对象的时候混入特质,改变对象中的特定方法
var acc2 = new SavingAccount() with TimeStampLogger
acc2.withdraw(100)
//从后往前调用
var acc3 = new SavingAccount() with TimeStampLogger with ShortterLogger
acc3.withdraw(100)
//从后往前调用
var acc4 = new SavingAccount() with ShortterLogger with TimeStampLogger
acc4.withdraw(100)
}