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: String
println(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

Trait基础的更多相关文章

  1. Spark基础-scala学习(三、Trait)

    面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...

  2. Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、

    1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...

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

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

  4. 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait

    [源码下载] 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait 作者:webabcd 介绍速战速决 之 PHP 类基础 抽象类 接口 trait 示例1.类的相关知识点 1(基础 ...

  5. <基础> PHP 进阶之 抽象类(abstract)、接口(interface)、Trait(特征)

    抽象类 PHP 5 支持抽象类和抽象方法.定义为抽象的类不能被实例化. 抽象方法只能在抽象类中,抽象类中可以包含非抽象方法 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现 继 ...

  6. Scala基础:面向对象之trait

    trait类似于java中的interface,但是有所不同 Scala中的trait是一种特殊的概念: 首先先将trait作为接口使用,此时的trait就与Java中的接口 (interface)非 ...

  7. Scala基础语法 (一)

    如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...

  8. php基础教程

    PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP Hypertext Preprocessor 什么是 PHP 文件? PHP 文件能够包含文本.HTML.CSS 以及 PHP 代 ...

  9. Scalaz(1)- 基础篇:隐式转换解析策略-Implicit resolution

    在正式进入scalaz讨论前我们需要理顺一些基础的scalaz结构组成概念和技巧.scalaz是由即兴多态(ad-hoc polymorphism)类型(typeclass)组成.scalaz typ ...

随机推荐

  1. [Web 前端] mobx教程(三)-在React中使用Mobx

    copy from : https://blog.csdn.net/smk108/article/details/85053903 Mobx提供了一个mobx-react包帮助开发者方便地在React ...

  2. REST API 调用 方法

    METHOD      DESCRIPTION GET         Retrieves the specified resource POST        Creates a resource ...

  3. 小程序入门学习Demo

    技术:小程序   概述 适合学习小程序的初级开发人员,入门教程 详细 代码下载:http://www.demodashi.com/demo/14956.html 小程序周边美甲美发预约Demo 代码主 ...

  4. C++中的三种继承关系

    C++中的三种继承关系 先看类中声明成员时的三种访问权限 public : 可以被任意实体访问 protected : 只允许子类及本类的成员函数访问 private : 只允许本类的成员函数访问 在 ...

  5. 简单理解 RPC(转载)

    原文地址:http://www.syyong.com/architecture/Simple-understanding-of-RPC.html RPC(Remote Procedure Call P ...

  6. Win10 calc.exe 无法打开计算器的解决方法

    先将所有程序关闭,以管理员身份运行 Windows PowerShell,之后输入以下命令 Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage - ...

  7. python 大数据处理小结

    1.shop_min=shop.drop(['category_id','longitude','latitude','price'],axis=1)pandas中删除多个列 2.mall=shop_ ...

  8. 欢迎访问我的最新个人技术博客http://zhangxuefei.site

    博客已经搬家,欢迎访问我的最新个人技术博客:http://zhangxuefei.site

  9. Odoo 进销存报表现已开源

    根据会计区间或自定义查询时间段,对仓库的产品出入库情况进行查看: 模块地址参见内部群公告.

  10. Spark性能优化指南——基础篇

    本文转自:http://tech.meituan.com/spark-tuning-basic.html 感谢原作者 前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一 ...