Trait基础

  1. 在Scala中,Trait是一种特殊概念。首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似。同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不给出方法的具体实现。
    注意:类使用extends继承Trait,与Java不同,这里不是implement,在Scala中,无论继承类还是继承Trait都是用extends关键字。

    在Scala中,类继承Trait后,必须实现其中的抽象方法,实现时不需要使用override关键字,同时Scala同Java一样,不支持类多继承,但支持多重继承Trait,使用with关键字即可。

  2. 在Trait中定义具体方法:通俗来讲,就是trait可以包含一些很多类都通用的功能,如打印日志等,在Spark中也使用Trait定义了通用的日志打印方法。也就是说Scala中的Trait不只定义抽象方法,还可以定义具体方法,也有的说法是Trait的功能混入了类。

  3. 在Trait中定义具体字段:在Scala中,Trait可以定义具体字段,继承Trait的类就自动获取了Trait中定义的类。
    注意:这里与继承Class不同,如果继承Class获取的字段,实际定义在父类中,而继承Trait获取的字段,就直接添加到了类中。

  4. 在Trait中可以定义抽象字段,而Trait中的具体方法可以基于抽象字段来编写,但继承Trait的类,则必须覆盖抽象的field,提供具体的值。


Trait进阶

  1. 为实例混入Trait:在创建某个类的对象时,可以指定该对象混入某个Trait,这样只有这个对象混入了该Trait,其他对象则没有

  2. Trait调用链:在Scala中,支持让类继承多个Trait,依次调用多个Trait中的同一个方法,只要让多个Trait中的同一个方法中,在最后都执行super方法。
    注意:在类中调用多个Trait中都有的方法时,首先会从最右边的Trait的方法开始执行,然后依次向左执行,形成一个调用条。这个相当于设计模式中的责任链模式的一种具体实现依赖。

  3. 在Trait中覆盖抽象方法:在Trait中,可以覆盖父Trait的抽象方法,但是覆盖时,如果使用了super方法的代码是无法通过编译的。如果要通过编译,就得给子Trait的方法加上abstract override修饰。

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

Trait高级

  • 混合使用Trait的具体方法和抽象:可以让具体方法依赖于抽象方法,抽象方法放到继承Trait的类中实现;

  • Trait构造机制:在Scala中,Trait是有构造代码的,就是Trait中不包含在任何方法中的代码,而继承了Trait的构造机制如下:
    1)父类的构造函数
    2)Trait的构造代码执行,多个Trait从左向右依次执行
    3)构造Trait时会先构造父Trait,如果多个Trait继承同一个父Trait,则父Trait只会构造一次
    4)所有trait构造结束之后,子类的构造函数执行

  • Trait 字段的初始化:在Scala中,Trait是没有接收函数的构造函数,这是Trait与Class的唯一区别,如果要求trait对字段进行初始化,智能使用Scala中的一种高级特性,即提前定义或使用Lazy Value。

trait Greet{val message: Stringprintln(message.toString)
}class Person
val p = new {val message: String = "Hello"
} with Person with Greet
//或者是
class Person extends {val message: String = "Hello"
}with Greet { }

另一种方式为使用lazy value

最后,Trait还继承class:在Scala中,Trait可以继承class,这个class就会成为所有继承该trait的类的父类

如有建议或其他问题,可随时给我们留言。转载请引用以下链接:

http://blog.csdn.net/Godfrey1/article/details/70316850

Scala Trait 详解(实例)相关推荐

  1. Scala Trait详解

    为什么80%的码农都做不了架构师?>>>    除了从父类集成代码外,Scala中的类还允许从一个或者多个traits中导入代码. 对于Java程序员来说理解traits的最好方法就 ...

  2. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

  3. Message,MessageQueue,Looper,Handler详解+实例

    Message,MessageQueue,Looper,Handler详解+实例 原文地址 Android的Handler使用(这篇简单介绍Handler的使用) 一.几个关键概念 1.Message ...

  4. php动态+trait,详解PHP神奇又有用的Trait

    php和java,c++一样都是单继承模式.但是像python,是支持多继承(即Mixin模式).那么如何在php中实现多继承模式?这就需要使用trait. trait Arrayabletrait{ ...

  5. Oracle Merge Into 的用法详解实例

    Oracle merge into 的用法详解实例 作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表: 语法: MERGE INTO [your table- ...

  6. java jtable组件_java中jtable组件详解实例

    java中jtable组件详解实例 java 表格控件 JTable 常用操作详解 JTable 是 Swing 编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处.一 ...

  7. Oracle translate() 详解+实例

    Oracle translate() 详解+实例 一.语法: TRANSLATE(string,from_str,to_str) 二.目的 返回将(所有出现的)from_str中的每个字符替换为to_ ...

  8. Linux命令--tree--使用/详解/实例

    原文网址: 见:Linux命令--tree--使用/详解/实例_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍Linux的tree命令的用法. tree命令可以以树状结构查看目录结构. 选项 ...

  9. 数据库三大范式详解实例图文教程

    title: 数据库三大范式详解实例图文教程 date: 2021-09-04 20:29:31 tags: 数据库 MySQL categories: 数据库 cover: https://cove ...

最新文章

  1. Redis简介和Redis Template用法整理
  2. Oracle “TNS-12535: TNS: 操作超时“故障的解除。
  3. 京东JDHBase异地多活实践
  4. 【Verilog HDL】深入理解部分语法规则的本质
  5. zbb20180913 java synchronized同步静态方法和同步非静态方法的异同
  6. 编译原理pl/0 c语言版 pl0.h文件
  7. Java里面as_与Java中的C#关键字“ as”等效
  8. sqlmap md5怎么解密_UC浏览器代理流量解密
  9. 计算机中那些事儿(十):资料管理一些建议---实践篇
  10. HP服务器和H3C交换机端口绑定
  11. invoke-obfuscation使用遇到的问题及Encoding免杀
  12. 嵌入式系统开发-麦子学院(5)——linux高级编程之文件IO管理
  13. 【Paper】WISDM:Activity Recognition using Cell Phone Accelerometers
  14. Kubernetes 调度 Node污点/容忍
  15. 2023年美业市场五大消费趋势
  16. 通过mtd读写flash_NOR Flash读写原理及驱动
  17. hadoop不在sudoers文件中。此事将被报告。 解决方法
  18. 一站式智能运维解决方案,企业系统的隐形守护者
  19. 通行证漫谈(不断补充)
  20. WhiteCell Come Back

热门文章

  1. 生活篇之工资和年终奖的纳税
  2. 两条直线的交点(叉积)
  3. 最大似然估计(MLE)与最小二乘估计(LSE)的区别
  4. Angular常用ng指令详解
  5. 经典CNN结构之AlexNet 复兴号角
  6. opencv图像处理之图像平移
  7. 你,真的会用海关数据开发客户吗?(附七问七答)
  8. USACO 1月 2021-2022 January Contest Silver银组 题解
  9. dede列表命名规则
  10. 次世代游戏建模师,一个极受追捧的高薪职业!