trait调用链

Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可

类中调用多个trait中都有这个方法时,首先会从最右边的trait的方法开始执行,然后依次往左执行,形成一个调用链条

这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖

trait Handle{
def handle(data:String){}
} trait DataValidHandler extends Handler{
override def handle(data:String){
println("check data :"+data)
super.handle(data)
}
} tarit SignatureValidHander extends Handler{
override def handle(data:String){
println("check singature:"+data)
super.handle(data)
}
} class Person(val name:String) extendsSignatuerValidHander with DataValidHandler{
def sayHello={ print("Hello,"+name);handle(name)}
} val p = new Person("leo")
p.sayHello #结果是:
hello,leo
check data :leo
check singature :leo

在trait中覆盖抽象方法

在trait中,是可以覆盖父trait的抽象方法的

但是覆盖时,如果使用了super.方法的代码,则无法通过编译。因为super.方法就会去掉用父trait的抽象方法,此时子trait的该方法还是会被认为是抽象的。

此时如果要通过编译,就得给子trait的方法加上abstract override修饰

trait Logger{

    def log(msg:String)

}

trait MyLogger extends Logger{
abstract override def log(msg:String){super.log(msg))
}

混合使用trait的具体方法和抽象方法

在trait中,可以混合使用具体方法和抽象方法

可以让具体方法依赖于抽象方法,而抽象方法则放到继承trait的类中去实现

这种trait其实就是设计模式中的模板设计模式的体现

#抽象方法的具体实现和具体实现的调用
trait Valid{
def getName name:String
def valid = Boolean{
getName ="leo"
}
} class Pserson(name:String) extends Valid{
print(valid)
getName=name
}

trait的构造机制

在Scala中,trait也是有构造代码的,也就是trait中的,不包含在任何方法中的代码

而继承trait的类的构造机制如下:1、父类的构造函数执行;2、trait的改造代码执行,多个trait从左往右依次执行;3、构造trait,如果多个trait继承同一个父trait,则父trait只会构造一次;4、所有trait构造完毕之后,子类的构造函数执行

class Person{ print("person's constractor!")}
trait Logger{print("Logger's constractor!")}
trait MyLogger extends Logger{print("MyLogger's constractor!")}
trait TimeLogger extends Logger{print("TimeLogger's constractor!")}
class Student extends Person with MyLogger with TimeLogger{print("student's constractor!")} val s = new Strudent #结果: person's constractor!
Logger's constractor!
MyLogger's constractor!
TimeLogger's constractor!
student's constractor!

Scala编程入门---面向对象编程之Trait高级知识的更多相关文章

  1. Scala编程入门---面向对象编程之Trait

    Scala中Trait是一种特殊概念 首先我们可以将Triat做为接口来使用,此时的Triat就与java中的接口非常相似 在Triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出具体的 ...

  2. Scala编程入门---面向对象编程之对象

    对象 Object,相当于class单个实例,通常在里面放一些静态的filed或method 第一次调用object方法时候,就会执行object的constructor,也就是Object中不在me ...

  3. scala学习笔记-面向对象编程之Trait

    将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可 ...

  4. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  5. 8、scala面向对象编程之Trait

    一.Trait基础 1.将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在t ...

  6. 10、scala面向对象编程之Trait

    1.  将trait作为接口使用 2.trait中定义具体方法 3.trait定义具体字段 4.trait中定义抽象字段 5.为实例对象混入trait 6.trait调用链 7.在trait中覆盖抽象 ...

  7. Scala 面向对象编程之Trait

    将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在triat中可以定义抽象方 ...

  8. Scala编程入门---函数式编程

    高阶函数 Scala中,由于函数时一等公民,因此可以直接将某个函数传入其他函数,作为参数.这个功能是极其强大的,也是Java这种面向对象的编程语言所不具备的. 接收其他函数作为函数参数的函数,也被称作 ...

  9. Scala编程入门---函数式编程之集合操作

    集合的函数式编程: 实战常用: //map案例实战:为List中的每个元素都添加一个前缀. List("leo","Jen","peter" ...

随机推荐

  1. Spark1.4从HDFS读取文件运行Java语言WordCounts

    Hadoop:2.4.0 Spark:1.4.0 Ubuntu 14.0 1.首先启动Hadoop的HDFS系统.     HADOOP_HOME/sbin/start-dfs.sh 2.在Linux ...

  2. java中Error与Exception有什么区别

    Error类和Exception类都继承自Throwable类. Error的继承关系: java.lang.Object  java.lang.Throwable      java.lang.Er ...

  3. 用SpriteBuilder简化"耕牛遍地走"的动画效果(一)

    这又是一个使用SpriteBuilder带来便捷的例子 原文地址在: http://www.raywenderlich.com/32045/how-to-use-animations-and-spri ...

  4. 【一天一道LeetCode】#92. Reverse Linked List II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Reverse ...

  5. leetcode 204题求素数个数

        Description: Count the number of prime numbers less than a non-negative number, n 提示晒数法: http:// ...

  6. Optimizing Item Import Performance in Oracle Product Hub/Inventory

    APPLIES TO: Oracle Product Hub - Version 12.1.1 to 12.1.1 [Release 12.1] Oracle Inventory Management ...

  7. SpriteBuilder使用Shader Effect的另一种方法

    记住你并不是必须要使用Effect节点去给一个特定的精灵应用效果. 你只要选择一个精灵然后切换至项目属性窗口(Item Properties tab),找到effects用户接口在CCSprite属性 ...

  8. libevent之event

    就如libevent官网上所写的“libevent - an event notification library”,libevent就是一个基于事件通知机制的库,可以看出event是整个库的核心.e ...

  9. Linux下实现秒级定时任务的两种方案(crontab 每秒运行)

    第一种方案,当然是写一个后台运行的脚本一直循环,然后每次循环sleep一段时间. while true ;do command sleep XX //间隔秒数 done 第二种方案,使用crontab ...

  10. HBase replication

    Hbase Replication 介绍 现状 Hbase 的replication目前在业界使用并不多见,原因有很多方面,比如说HDFS目前已经有多份备份在某种程度上帮助HBASE底层数据的安全性, ...