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:然后子类可以在自己内部放入父 ...
随机推荐
- CentOS 安装Oracle 11g R2
CentOS 安装Oracle 11g R2 学习了-/ https://www.osyunwei.com/archives/5445.html
- 解DBA之惑:数据库承载能力评估及优化手段
原创 2016-08-29 韩锋 DBAplus社群 作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职 ...
- postgresql 删除旧的版本9.5 并同时 升级到9.6
sudo apt-get purge postgresql-9.5 On Ubuntu 14.04 I have done this to get the latest postgres: sudo ...
- Windows 如何在右键中添加“在此处打开CMD窗口”选项
将以下代码保存为XXX.reg,然后双击导入注册表 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\ ...
- Javascript中双等号(==)隐性转换机制 JS里charCodeAt()和fromCharCode()方法拓展应用:加密与解密
Javascript中双等号(==)隐性转换机制 在Javascript中判断相等关系有双等号(==)和三等号(===)两种.其中双等号(==)是值相等,而三等号(===)是严格相等(值及类型是否 ...
- Android自定义用户控件简单范例(二)
对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应 ...
- Android之实现ViewPager+Fragment左右滑动
近期看新闻发现新闻的页面是能够左右滑动的.于是自己就好奇起来了,之前做过ViewPager展示图片,在想怎么载入页面呢?研究了一下.发现就是加入了Fragment,废话不多说,揭秘奥秘的时候到了. 使 ...
- [Unity UGUI]ScrollRect效果大全
UGUI各种优化效果 本文所实现的UGUI效果需求如下: - 支持缩放滑动效果 - 支持动态缩放循环加载 - 支持大数据固定Item复用加载 - 支持不用Mask遮罩无限循环加载 - 支持Object ...
- 不仅开源,而且对企业应用完全免费!ExtAspNet弃用GPL v2,拥抱Apache License 2.0(转)
不仅开源,而且对企业应用完全免费!ExtAspNet弃用GPL v2,拥抱Apache License 2.0(转) 提出问题 ExtAspNet开源以来,一直坚持开源免费的原则,但是其GPL v2的 ...
- 【bzoj1251】序列终结者(伸展树)
[bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...