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

mac2022-06-30  77

初始化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 constructorFileLogger constructorSavingFile constructorfilename:helloAccount constructorLogged constructorFileLogger constructorfilename:hello

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

class AccountTest { println("AccountTest constructor") var filename = "hello" } (new AccountTest() with FileLogger).log("")

运行结果:

AccountTest constructorLogged constructorFileLogger constructorfilename:hello

 

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

最新回复(0)