zoukankan      html  css  js  c++  java
  • Scala 多继承问题

    多继承问题:

    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")
    
    }
    
  • 相关阅读:
    75
    74
    接口理论知识
    软件测试计划的编写
    软件测试的生命周期&软件测试工作流程
    软件测试分类体系系统学习
    Mysql之高级查询
    数据库的DML操作
    Mysql之数据完整性约束
    Mysql之DDL操作
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/8016449.html
Copyright © 2011-2022 走看看