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")
    
    }
    
  • 相关阅读:
    retofit、ButterKnite
    [iOS笔记]Swift中的Optional类型
    [iOS笔记] 网络通信安全与证书
    [iOS]ReactiveCocoa playground配置
    NAT学习笔记
    [iOS学习笔记]runloop runMode方法调研
    Python 装饰器简单介绍
    cookie实现自动登陆原理
    iOS开发添加Reveal工具
    【iOS Programming: The Big Nerd Ranch Guide】【笔记】2
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/8016449.html
Copyright © 2011-2022 走看看