zoukankan      html  css  js  c++  java
  • 快学Scala 第十八课 (trait多继承)

    trait多继承:

    trait的继承并不像类拥有相同的含义!在下面这个例子中,如果还是运用类的继承的思想,那么运行结果将是什么也没有。

    trait Logged {
      def log(msg: String){ }
    }
    
    trait ConsoleLogger extends Logged {
     override def log(msg: String){
           super.log(msg)
    
      }
      
    }
    

    但是事实并非如此:

    trait Logged {
      def log(msg: String){ println("Logged")}
    }
    
    
    trait ConsoleLogger extends Logged {
     override def log(msg: String){
       println("ConsoleLogger")
           super.log(msg)
      }
      
    }
    
    trait ShortLogger extends Logged{
       override def log(msg: String){
       println("ShortLogger")
      }
      
    }
    
    class SavingsAccount extends ShortLogger with ConsoleLogger {
      println("SavingsAccount")
      log("funds")
      
    }
    
    new SavingsAccount()
    

    运行结果:

    SavingsAccount
    ConsoleLogger
    ShortLogger

    由上可见,super.log通常调用trait从最后一个开始,从右往左调用。但是如果右边的trait是左边trait的超类,那么次序会调换,先调用子再调用父。

    如果想要强制调用父trait,则可使用以下方式:

    trait ConsoleLogger extends Logged {
     override def log(msg: String){
       println("ConsoleLogger")
        super[Logged].log(msg)
    
      }
      
    }
    
  • 相关阅读:
    volatile详解
    Java并发之AQS详解
    Thread详解
    Hibernate检索策略
    Hibernate查询方式
    Hibernate--对象关系
    hibernate--hibernate.cfg.xml常用配置详解
    hibernate--CRUD初体验
    hibernate--HelloWorld
    Struts支持的contentType
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7420433.html
Copyright © 2011-2022 走看看