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)
    
      }
      
    }
    
  • 相关阅读:
    指针总结与地址
    寻址方式
    为什么要有指针?
    指针与变量
    Wired Memory
    Memory Usage Performance Guidelines
    内存管理与运行时
    Java jvm 内存回收机制
    GC详解及Minor GC和Full GC触发条件总结
    Java的内存回收机制详解X
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7420433.html
Copyright © 2011-2022 走看看