大数据Scala系列之特质

  

大数据Scala系列之特质,特质的定义除了使用关键字特征之外,与类定义无异。

  

特质用来在类之间进行接口或者属性的共享。类和对象都可以继承特质,特质不能被实例化,因此也没有参数。

  

一旦特质被定义了,就可以使用扩展或者与在类中混入特质。

  

1作为接口使用的特质
特质的定义:

  

特质记录器{
//这是一个抽象方法,特质中未被实现的方法默认是抽象的,不需要抽象的关键字修饰
def日志(味精:字符串)
}

  

子类对特质的实现:

  

类ConsoleLogger延伸记录器{
//重写抽象方法,不需要覆盖
def日志(味精:字符串){println(味精)}
}

  

2带有具体实现的特质
特质ConsoleLogger {
//注意与Java中接口的不同
def日志(味精:字符串){println(味精)}
}

  

特质的使用

  

SavingAccount类扩展了账户ConsoleLogger {
def撤回(数量:双){
如果(在数量平衡)日志(“Insufficent funds")
其他数量平衡-=
}
}

  

3带有特质的对象
scala自带有记录特质,但是没有实现

  

特征记录{
def日志(味精:字符串){}
}

  

如果在类定义中使用了该特质

  

//该类中,其中的日志信息不会被记录
SavingAccount类扩展了账户记录{
def撤回(数量:双){
如果(在数量平衡)日志(“Insufficent funds")
其他数量平衡-=
}
}

  

标准的ConsoleLogger扩展自记录器

  

类ConsoleLogger延伸记录器{
//重写抽象方法,不需要覆盖
def日志(味精:字符串){println(味精)}
}

  

可以在创建对象的时候,加入该特质:

  

val acct1=新SavingAccount ConsoleLogger

  

这样,创建同一类对象,却可以加入不同的特质

  

val acct2=新SavingAccount FileLogger

  

4多个叠加的特质
可以为类或者对象添加多个互相调用的特质,特质的执行顺序,取决于特质被添加的顺序

  

特征记录{
def日志(味精:字符串)
}
特质ConsoleLogger扩展记录{
//重写抽象方法,不需要覆盖
def日志(味精:String)={println(味精)}
}
//给日志加上时间戳
特质TimestampLogger延伸ConsoleLogger {
覆盖def日志(味精:字符串){
super.log (s" $ {java.time.Instant.now ()} $ msg")
}
}
//截断过于冗长的日志信息
特质ShortLogger延伸ConsoleLogger {
val最大长度=15
覆盖def日志(味精:字符串){
super.log (
如果(味精。长度& lt;其他=最大长度)味精

s" $ {msg.substring (0, maxLength-3)}…“)
}
}
//定义超类
类账户{
保护var平衡:双=0
}
SavingAccount类扩展了账户ConsoleLogger {
def撤回(数量:双){
如果(在数量平衡)日志(“Insufficent funds")
余额=资产-其他金额
}
}

  

对象测试{
def主要(args:数组[String]):单位={
val acct1=new SavingAccount与ConsoleLogger TimestampLogger ShortLogger
val acct2=new SavingAccount与ConsoleLogger ShortLogger TimestampLogger
acct1.withdraw (100.0)
acct2.withdraw (100.0)

  

}
}

  

//res:
//ShortLogger的日志方法先被执行,然后它的超级。日志调用的是TimestampLogger日志的方法,最后调用ConsoleLogger的方法将信息打印出来
2018 - 06 - 15 t16:50:28.448z Insufficent……
//先是TimestampLogger的日志方法被执行,然后它的超级。日志调用的是ShortLogger日志的方法,最后调用ConsoleLogger的方法将信息打印出来
2018 - 06 - 15 - t1…

  

5使用特质统一编程进口scala.collection.mutable.ArrayBuffer

  

特质宠物{
val名称:字符串
}

  

类猫(val name:字符串)扩展宠物
类狗(val name:字符串)扩展了宠物

  

val狗=new狗(“Harry")
val猫=new猫(“Sally")

  

=ArrayBuffer.empty val动物(宠物)
animals.append(狗)
animals.append (cat)
动物。foreach (pet=比;println (pet.name))//打印哈利莎莉

  

mixin用于进行类组合的特质:

  

抽象类{
val信息:字符串
}
B类扩展了一个{
val消息=拔依嗟囊桓鍪道鼴"
}
//此处的特质C即为mixin
特质C扩展{
def loudMessage=message.toUpperCase ()
}
D类扩展了B和C

  

val d=new d
println (d.message)//我是B类的一个实例
println (d.loudMessage)//我是B类的一个实例

  

6当做富接口使用的特质
//注意抽象方法和具体方法的结合
特质记录器{def日志(味精:字符串)

大数据Scala系列之特质