Trait基础
Trait基础
在Scala中,Trait是一种特殊概念。首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似。同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不给出方法的具体实现。
注意:类使用extends继承Trait,与Java不同,这里不是implement,在Scala中,无论继承类还是继承Trait都是用extends关键字。在Scala中,类继承Trait后,必须实现其中的抽象方法,实现时不需要使用override关键字,同时Scala同Java一样,不支持类多继承,但支持多重继承Trait,使用with关键字即可。
在Trait中定义具体方法:通俗来讲,就是trait可以包含一些很多类都通用的功能,如打印日志等,在Spark中也使用Trait定义了通用的日志打印方法。也就是说Scala中的Trait不只定义抽象方法,还可以定义具体方法,也有的说法是Trait的功能混入了类。
在Trait中定义具体字段:在Scala中,Trait可以定义具体字段,继承Trait的类就自动获取了Trait中定义的类。
注意:这里与继承Class不同,如果继承Class获取的字段,实际定义在父类中,而继承Trait获取的字段,就直接添加到了类中。在Trait中可以定义抽象字段,而Trait中的具体方法可以基于抽象字段来编写,但继承Trait的类,则必须覆盖抽象的field,提供具体的值。
Trait进阶
为实例混入Trait:在创建某个类的对象时,可以指定该对象混入某个Trait,这样只有这个对象混入了该Trait,其他对象则没有
Trait调用链:在Scala中,支持让类继承多个Trait,依次调用多个Trait中的同一个方法,只要让多个Trait中的同一个方法中,在最后都执行super方法。
注意:在类中调用多个Trait中都有的方法时,首先会从最右边的Trait的方法开始执行,然后依次向左执行,形成一个调用条。这个相当于设计模式中的责任链模式的一种具体实现依赖。在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的类的父类
如有建议或其他问题,可随时给我们留言。转载请引用以下链接:
Trait基础的更多相关文章
- Spark基础-scala学习(三、Trait)
面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...
- Scala学习教程笔记二之函数式编程、Object对象、伴生对象、继承、Trait、
1:Scala之函数式编程学习笔记: :Scala函数式编程学习: 1.1:Scala定义一个简单的类,包含field以及方法,创建类的对象,并且调用其方法: class User { private ...
- 8、scala面向对象编程之Trait
一.Trait基础 1.将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在t ...
- 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait
[源码下载] 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait 作者:webabcd 介绍速战速决 之 PHP 类基础 抽象类 接口 trait 示例1.类的相关知识点 1(基础 ...
- <基础> PHP 进阶之 抽象类(abstract)、接口(interface)、Trait(特征)
抽象类 PHP 5 支持抽象类和抽象方法.定义为抽象的类不能被实例化. 抽象方法只能在抽象类中,抽象类中可以包含非抽象方法 被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现 继 ...
- Scala基础:面向对象之trait
trait类似于java中的interface,但是有所不同 Scala中的trait是一种特殊的概念: 首先先将trait作为接口使用,此时的trait就与Java中的接口 (interface)非 ...
- Scala基础语法 (一)
如果你之前是一名 Java 程序员,并了解 Java 语言的基础知识,那么你能很快学会 Scala 的基础语法. Scala 与 Java 的最大区别是:Scala 语句末尾的分号 ; 是可选的. 我 ...
- php基础教程
PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP Hypertext Preprocessor 什么是 PHP 文件? PHP 文件能够包含文本.HTML.CSS 以及 PHP 代 ...
- Scalaz(1)- 基础篇:隐式转换解析策略-Implicit resolution
在正式进入scalaz讨论前我们需要理顺一些基础的scalaz结构组成概念和技巧.scalaz是由即兴多态(ad-hoc polymorphism)类型(typeclass)组成.scalaz typ ...
随机推荐
- C# CountdownEvent实现
关于CountdownEvent网上的介绍比较少,因为它是实现和使用都很简单,先看看网上的一些评论吧: CountDownEvent调用成员函数Wait()将阻塞,直至成员函数Signal() 被调用 ...
- assert BOOST_ASSERT的坑
下面这行代码 BOOST_ASSERT(SUCCEEDED(m_pd3dDevice->CreateBuffer(&frame_ptr->m_const_buffers[i].m_ ...
- PHP-问题处理Fatal error: Uncaught Error: Call to undefined function mb_strlen()
1.问题 今天重新安装了ubuntu,PHP,MySQL,Apache,到测试CMS项目时发生一个错误: Fatal error: Uncaught Error: Call to undefined ...
- 物联网架构成长之路(29)-Jenkins环境搭建
0. 说明 哈哈,前面中间插入了一篇Eclipse增加Git插件,在此之前真的没有用过GIT. 1. 运行Jenkins 这里为了方便,还是用Docker方式安装,由于这个是标准的war报,不对Doc ...
- 2018铁三测评题write以及一些想送给你们的话
一..前言 此文献给实验室的萌新们,以及刚刚接触CTF的同学们,希望能对你们的成长起到一些帮助. 二.关于CTF 可能你已经接触过CTF或者对它有所了解,这里我再简单介绍一下. 1.什么是CTF? C ...
- [转]Mybatis foreach 批量操作
原文地址:https://blog.csdn.net/jason5186/article/details/40896043 foreach属性属性 描述item 循环体中的具体对象.支持属 ...
- elasticsearch 一、环境配置
简介 ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例,是基于Lucene构建的.支持时间时间索引和全文检索.官网:http://www.elastics ...
- hdoj:2086
A1 = ? Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- [Z] SQL SERVER 的前世今生--各版本功能对比
https://www.cnblogs.com/OwenZeng/p/6813143.html
- mysql数据字段整理
<?php header('content-type:text/html;charset=utf-8'); define('DB_HOST','127.0.01'); define('DB_US ...