10、scala面向对象编程之Trait
1、 将trait作为接口使用
2、trait中定义具体方法
3、trait定义具体字段
4、trait中定义抽象字段
5、为实例对象混入trait
6、trait调用链
7、在trait中覆盖抽象方法
8、混合使用trait的具体方法和抽象方法
9、trait的构造机制
10、trait field的初始化
11、trait继承class
1、 将trait作为接口使用
在scala中,trait是一种特殊的概念,可以将trait作为接口来使用。
Trait可以定义抽象方法,与抽象类中的抽象方法一样,只要不给出方法的具体实现即可。
类可以使用extends关键字继承trait,sclaa中没有implement的概念,无论继承还是trait。
类继承trait后,必须实现其中的抽象方法,实现时不需要使用override关键字。
Scala不支持对类进行多继承,但是支持多继承trait,使用with关键字即可。

2、trait中定义具体方法
Trait不是只定义抽象方法,还可以定义具体方法,此时trait更像是包含了通用工具的方法。
有一个专有名词来形容这种情况,就是说trait的功能混入了类。
Trait中可以包含一些很多类都通用的功能方法,比如打印日志等等。

3、trait定义具体字段
Trait可以定义具体field,此时继承trait的类就自动获得了trait中定义的field。
这种获取field的方式与继承class是不同的,如果是继承class获取的field,实际上是定义在父类中的,而继承trait获取的field,就直接被添加到了类中。

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

5、为实例对象混入trait
有时候我们创建类的时候,指定该对象混入某个trait,这样就只有这个对象混入该trait的方法,而类的其他对象则没有。

6、trait调用链
Scala中支持让类继承多个trait,依次调用多个trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行supper方法即可。
类中调用多个trait中都有的这个方法时,首先会从最右边的trait的方法开始执行,依次往左执行,形成一个调用链条。
这种特性非常强大,其实就相当于设计模式中的责任链模式的一种具体实现依赖。

7、在trait中覆盖抽象方法
Trait中,可以覆盖父trait的抽象方法。覆盖时,如果使用了super.方法的代码,则无法通过编译。因为super.方法就会去掉用父trait的抽象方法,此时子trait的该方法还是会被认为是抽象的。如果要通过编译,就得给trait的方法加上abstract override修饰。

8、混合使用trait的具体方法和抽象方法
在trait中,可以混合使用具体方法和抽象方法,可以让具体方法依赖于抽象方法,而抽象方法则放在继承trait的类中去实现。
这种trait其实就是设计模式中的模板设计模式的体现。

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

10、trait field的初始化
Scala中,trait没有接受参数的构造函数,如果需求就是要trait能对field进行初始化,只能使用scala中非常特殊的一种高级特性,即提前定义。
两种提前定义

另外一种方式就是使用lazy value

11、trait继承class
Scala中,trait可以继承自class,此时这个class就会成为所有继承该trait的类的父类。

10、scala面向对象编程之Trait的更多相关文章
- 8、scala面向对象编程之Trait
一.Trait基础 1.将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在t ...
- Scala 面向对象编程之Trait
将trait作为接口使用 // Scala中的Triat是一种特殊的概念 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 // 在triat中可以定义抽象方 ...
- scala学习笔记-面向对象编程之Trait
将trait作为接口使用 1 // Scala中的Triat是一种特殊的概念 2 // 首先我们可以将Trait作为接口来使用,此时的Triat就与Java中的接口非常类似 3 // 在triat中可 ...
- Scala编程入门---面向对象编程之Trait高级知识
trait调用链 Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可 类中调用多个trait中都有这个 ...
- Scala编程入门---面向对象编程之Trait
Scala中Trait是一种特殊概念 首先我们可以将Triat做为接口来使用,此时的Triat就与java中的接口非常相似 在Triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出具体的 ...
- 9、scala面向对象编程之继承
1. extends 2.override 和super 3.override field 4.isInstanceOf和asInstanceOf 5.getClass和classOf 6.使用模式 ...
- 8、scala面向对象编程之对象
1. Object 2.伴生对象 3.让object继承抽象类 4.apply方法 5.main方法 6.用object实现枚举功能 1. Object Object,相当于class的单个实例, ...
- Scala 面向对象编程之对象
此对象非彼java bean对象 是scala object的对象 Object // object,相当于class的单个实例,通常在里面放一些静态的field或者method // 第一次调用ob ...
- Scala 面向对象编程之继承
extends关键字 // Scala中,让子类继承父类,与Java一样,也是使用extends关键字 // 继承就代表,子类可以从父类继承父类的field和method:然后子类可以在自己内部放入父 ...
随机推荐
- HDU1914(稳定婚姻)
http://acm.hdu.edu.cn/showproblem.php?pid=1914 思路:Gale-Shapley算法.算法过程是男士不停地求婚,女士不停地拒绝.在每一轮中,每个尚未订婚的男 ...
- xtrabackup 恢复单表步骤
1.apply-log应用redo日志,并导出表的数据字典innobackupex --apply-log --export 备份集 2.建表 如果知道表结构,则重建删除的表 create tabl ...
- addEventListener()、attachEvent()和removeEventListener()、detachEvent()的差别?
addEventListener()和attachEvent()的差别? addEventListener:在HTML元素上绑定事件,FF.chrome.opera.safari及IE9浏览器以上的支 ...
- 如何基于udp实现tcp协议栈
http://bbs.csdn.net/topics/280046868 使用套接字完成,按照tcp的方式在一个套接字里维持一个状态机. //定义枚举: enmu state{ CLOSED,//没有 ...
- 条款39: 避免 "向下转换" 继承层次
基类指针不能调用派生类的独有的成员,即使基类指针指向派生类对象,因为编译器是根据指针的静态类型来确定调用对象在内存中占据的空间的.此时可以使用static_cast来转换,但不要这么做,因为向下转换难 ...
- oninput 中文输入
使用 input 监听 input 中文输入,会被每次输入的字母打断,下面就解决这个问题 $('input') .off() .on('input',function(){ if($(this).pr ...
- R环境中的工作空间(workspace)
工作空间(workspace)就是当前R的工作环境,它储存着全部用户定义的对象(向量.矩阵.函数.数据框.列表) . 在一个R会话结束时,你能够将当前工作空间保存到一个镜像中.并在下次启动R时自己主动 ...
- 【网络流】 HDU 3468 Treasure Hunting
题意: A-Z&&a-z 表示 集结点 从A点出发经过 最短步数 走到下一个集结点(A的下一个集结点为B ,Z的下一个集结点为a) 的路上遇到金子(*)则能够捡走(一个点仅仅能捡一次) ...
- Android showDialog时报错requestFeature() must be called before adding content
View view = View.inflate(this, R.layout.layout_dialog, null); AlertDialog alertDialog = new AlertDia ...
- 02-JZ2440裸机学习之GPIO实验【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/54910717 版权声明:本文为博主原创文章,转载请注明http://blog.c ...