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")
    
    }
    
  • 相关阅读:
    spring----AOP 和 AspectJ
    js----wangEditor
    java易错题----获取路径问题
    Spring MVC----Validation(数据校验)
    java----lombok插件
    jquery----Ztree
    java web----跨域请求解决办法
    git----gitHub和电脑绑定的步骤
    js----DateTime工具
    SQLSTATE[HY000]: General error: 1366 Incorrect string value: 'xF0x9Fx90xA3xF0x9F...' for column
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/8016449.html
Copyright © 2011-2022 走看看