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. JSP编译成Servlet(四)JSP与Java行关系映射

    我们知道java虚拟机只认识class文件,要在虚拟机上运行就必须要遵守class文件格式,所以JSP编译成servlet后还需要进一步编译成class文件,但从JSP文件到java文件再到class ...

  2. 05_学生管理系统,xml读写,布局的综合应用

     最终要做的项目目标: 2.编写Android清单文件AndroidManifest.xml <?xml version="1.0" encoding="utf ...

  3. 敏捷测试(1)--TDD概念

    题记 本系列笔记将从测试人员的角度,总结在百度两年来的测试经验,记录一个完整的基于敏捷流程的验收测试全过程,分享在测试过程中的一些知识和经验,以及自己的一些理念.总结自己,也希望对大家有益. 概念 验 ...

  4. Android中显示gif动态图片

    在android中显示一个静态图片比如png jpg等等都很方便,但是如果要显示一个gif 动态图片就需要进行一些处理. 本文是采用自定义view 然后进行重新onDraw方法来实现 首先自定义Vie ...

  5. LayoutInflater和inflate的用法,有图有真相

    1.概述 有时候在我们的Activity中用到别的layout,并且要对其组件进行操作,比如: A.acyivity是获取网络数据的,对应布局文件为A.xml,然后需要把这个数据设置到B.xml的组件 ...

  6. 数据库用户映射到SQL Server登录名

    由于不是固定在一如电脑开始,经常需要把数据备份与恢复.或者是帮助客户修改程序,接收到客户备份好的数据,需要在电脑恢复. 这样就需要将数据库用户映射到 SQL Server 登录名.如何映射?可使用下面 ...

  7. 运行Myeclipse时,如何删除IVM窗口

    windows------>preference------>run/debug------->lauching--------->percpectives,改成never,n ...

  8. C++之默认参数

    C++可以为不指定参数提供默认值.一旦给一个参数赋了默认值,后面的所有参数,也都必须为默认值,并且默认值的类型也必须正确,默认值可以在原型或者函数定义中给出,但是不能两个位置同时给出. 接下来我们上代 ...

  9. 关于Maven中打包命令(项目中打补丁的时候用到)

     打jar包的方式  mvn package -Dmaven.test.skip=true              mvn install -Dmaven.test.skip=true      ...

  10. ListView 与ContextMenu的关联管理

    <span style="font-family: Arial, Helvetica, sans-serif;">package com.example.listvie ...