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")
    
    }
    
  • 相关阅读:
    oracle的row_number()和rownum
    linux视频学习6(mysql的安装/)
    linux视频学习5(top, 网络监控
    linux视频学习4(crontab和进程)
    linux的视频学习4(网络配置和rpm)
    linux视频学习3(shell和网络)
    linux视频学习3(linux安装,shell,tcp/ip协议,网络配置)
    linux(视频学习)2
    linux视频学习(简单介绍)20160405
    java代码用dom4j解析xml文件的简单操作
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/8016449.html
Copyright © 2011-2022 走看看