zoukankan      html  css  js  c++  java
  • 快学Scala 第二十一课 (初始化trait的抽象字段)

    初始化trait的抽象字段:

    trait Logged {
      println("Logged constructor")
      def log(msg: String){ println("Logged")}
    }
    
    trait FileLogger extends Logged {
      var filename: String
      override def log(msg: String) {
        println("filename:" + filename)
      }
    
    }
    

    在trait中定义了抽象字段我们应该如何初始化他呢?

    如果我们简单的在类中覆盖,由于trait构造在类构造之前运行,所以无法初始化filename。那怎么办呢?

    方法有三种:

    前两种属于预先定义

    class SavingFile extends { var filename = "hello"} with FileLogger{
      
    }
    
          new SavingFile().log("")
          (new {var filename = "hello"} with Account() with FileLogger).log("")
    

    运行结果:

    Logged constructor
    FileLogger constructor
    SavingFile constructor
    filename:hello
    Account constructor
    Logged constructor
    FileLogger constructor
    filename:hello

    第三种:因为动态继承trait,是在类构造之后进行,所以可以如下操作:

    class AccountTest {
      println("AccountTest constructor")
      var filename = "hello" 
    }
    
    (new AccountTest() with FileLogger).log("")

    运行结果:

    AccountTest constructor
    Logged constructor
    FileLogger constructor
    filename:hello

  • 相关阅读:
    c语言中重要函数
    python 类属性、对象属性
    windows下PIP安装模块编码错误解决
    python爬取百思不得姐视频
    ubuntu下刷新dns
    pycharm设置安装python第三方插件
    python将str转换成字典
    pyqt加载图片
    Python端口扫描器
    自己构造用于异步请求的JSON数据
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7475745.html
Copyright © 2011-2022 走看看