Scala 多继承问题
2024-08-31 08:55:53
多继承问题:
object LoadIssueDemo extends App { import java.io.PrintWriter trait Logger {
def log(msg: String): Unit
} trait FileLogger extends Logger {
val fileName: String
val fileOutput = new PrintWriter(fileName: String)
fileOutput.println("#") def log(msg: String): Unit = {
fileOutput.print(msg)
fileOutput.flush()
}
} class Person class Student(var name: String) extends Person with FileLogger {
override val fileName: String = "file.log" } new Student("Win").log("trait demo") }
运行结果:
原因:fileName还未初始化,就被方法调用。
解决方法:
1. 提前定义 (代码不够优雅)
object PreDefineDemo extends App{
import java.io.PrintWriter trait Logger{
def log(msg: String): Unit
} trait FileLogger extends Logger {
val fileName: String
val fileOutput = new PrintWriter(fileName: String)
fileOutput.println("#") def log(msg: String): Unit ={
fileOutput.print(msg)
fileOutput.flush()
}
} class Person
class Student(var name: String) extends Person with FileLogger{
override val fileName: String = "file.log" } new { override val fileName: String = "file.log"} with Student("Win").log("trait demo") }
2. 懒加载(推荐)
object LazyLoadDemo extends App{
import java.io.PrintWriter trait Logger{
def log(msg: String): Unit
} trait FileLogger extends Logger {
val fileName: String
lazy val fileOutput = new PrintWriter(fileName: String) def log(msg: String): Unit ={
fileOutput.print(msg)
fileOutput.flush()
}
} class Person
class Student(var name: String) extends Person with FileLogger{
override val fileName: String = "file.log" } val s = new Student("Win")
s.log("#")
s.log("Lazy demo") }
最新文章
- 初学者-PHP笔记
- ipad
- 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
- smdkv210
- SQLServer异常捕获
- RESTful API 设计最佳实践(转)
- Android之提交数据到服务端方法简单封装
- C语言随笔_区分=与==
- php读取excel文档内容(转载)
- Cookie禁用 获取session
- A.01.11—模块的输出—输出复用和可配
- Hadoop学习笔记(五):java开发MapReduce
- new Vue 发生了什么
- https://github.com/Lushenggang/show-pdf在线浏览pdf文件在线浏览pdf文件
- ASP.NET 之 MVC框架及搭建
- SpringData修改和删除操作
- eigen安装
- leetcode-209-长度最小的子数组
- java基本编译
- 浅谈ES6基础——Promise