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)
    
      }
      
    }
    
  • 相关阅读:
    前端开发—HTML
    初识 Django
    前端开发—BOM对象DOM文档对象操作
    前端开发—jQuery
    前端开发—Javascript
    前端开发—CSS 盒子、浮动、定位
    前端开发—CSS
    html模拟手机页面
    人类简史读书笔记
    正则表达式
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7420433.html
Copyright © 2011-2022 走看看