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

  • 相关阅读:
    Day 24 Network Programming
    Day 22 23 Network Programming
    Day 21 OOP
    Day 20 OOP
    Day 19 OOP
    Day 18 OOP 面向对象编程
    Day 17 Frequently-used modules
    4--jenkins部署tomcat
    3--Jenkins详解 、用户权限、构建maven、参数化构建
    5--Zabbix分布式 监控 ; snmp监控
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7475745.html
Copyright © 2011-2022 走看看