快学Scala 第二十一课 (初始化trait的抽象字段)

初始化trait的抽象字段:

 

trait Logged {
  println("Logged constructor")
  def log(msg: String){ println("Logged")}
}

trait FileLogger extends Logged {
  var filename: String
  override def log(msg: String) {
    println("filename:" + filename)
  }

}

 

在trait中定义了抽象字段我们应该如何初始化他呢?

如果我们简单的在类中覆盖,由于trait构造在类构造之前运行,所以无法初始化filename。那怎么办呢?

方法有三种:

前两种属于预先定义

class SavingFile extends { var filename = "hello"} with FileLogger{
  
}

 

      new SavingFile().log("")
      (new {var filename = "hello"} with Account() with FileLogger).log("")

运行结果:

Logged constructor
FileLogger constructor
SavingFile constructor
filename:hello
Account constructor
Logged constructor
FileLogger constructor
filename:hello

第三种:因为动态继承trait,是在类构造之后进行,所以可以如下操作:

class AccountTest {
  println("AccountTest constructor")
  var filename = "hello" 
}

(new AccountTest() with FileLogger).log("")

运行结果:

AccountTest constructor
Logged constructor
FileLogger constructor
filename:hello

 

转载于:https://www.cnblogs.com/AK47Sonic/p/7475745.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值