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的更多相关文章

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

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

  2. Scala 面向对象编程之Trait

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

  3. scala学习笔记-面向对象编程之Trait

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

  4. Scala编程入门---面向对象编程之Trait高级知识

    trait调用链 Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可 类中调用多个trait中都有这个 ...

  5. Scala编程入门---面向对象编程之Trait

    Scala中Trait是一种特殊概念 首先我们可以将Triat做为接口来使用,此时的Triat就与java中的接口非常相似 在Triat中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出具体的 ...

  6. 9、scala面向对象编程之继承

    1.  extends 2.override 和super 3.override field 4.isInstanceOf和asInstanceOf 5.getClass和classOf 6.使用模式 ...

  7. 8、scala面向对象编程之对象

    1.  Object 2.伴生对象 3.让object继承抽象类 4.apply方法 5.main方法 6.用object实现枚举功能 1.  Object Object,相当于class的单个实例, ...

  8. Scala 面向对象编程之对象

    此对象非彼java bean对象 是scala object的对象 Object // object,相当于class的单个实例,通常在里面放一些静态的field或者method // 第一次调用ob ...

  9. Scala 面向对象编程之继承

    extends关键字 // Scala中,让子类继承父类,与Java一样,也是使用extends关键字 // 继承就代表,子类可以从父类继承父类的field和method:然后子类可以在自己内部放入父 ...

随机推荐

  1. 中间件解析FDMEMTABLE.delta生成SQL的方法

    遍历Delta.DataView.Rows,Delta.DataView.Rows是记录的行集,由行组成 TFDDatSRow,即是一行记录的对象 TFDDatSRow的方法:  GetData(), ...

  2. Windows下擴展ubuntu虛擬機的分區大小

    在虛擬分區上安裝ubuntu,8G的分区不够用,不願意重装,增加VM分区吧!先备份虛擬硬盤文件 VMWARE自带的工具:找到vmware安装目录下vmware-vdiskmanager.exe,双击無 ...

  3. Solid Edge如何制作爆炸图

    1 最方便的方式是自动爆炸 点击应用程式-"爆炸-涂彩-动画"   选择要爆炸的对象(默认是顶层组立件),要爆炸的距离(默认系统根据零件大小自动生成距离,你也可以手动设定距离)即可 ...

  4. MySQL用户及数据安全专题

    1 简单介绍 1.1 概要 1.2 权限分类 2 加入用户     2.1 语法例如以下: CREATE USER user_specification [, user_specification] ...

  5. iOS截取视频某一帧图片(关键帧,AVAssetImageGenerator)

    获取第一帧图片 导入 AVFoundation.Framework.CoreMedia.Framework 实现代码例如以下: + (UIImage*) thumbnailImageForVideo: ...

  6. UVA 10385 - Duathlon(三分法)

    UVA 10385 - Duathlon 题目链接 题意:一些运动员,參加铁人两项,跑步r千米,骑车k千米,如今知道每一个人的跑步和骑车速度,问是否能设置一个r和k,保持r + k = t,使得第n个 ...

  7. openGl学习之基本图元

    从本篇開始,会给出一些代码实例,所以要配置好编译环境. 环境配置: vs2012下配置链接http://www.cnblogs.com/dreampursuer/archive/2014/05/27/ ...

  8. LeetCode 160. Intersection of Two Linked Lists (两个链表的交点)

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  9. URAL 1822. Hugo II's War 树的结构+二分

    1822. Hugo II's War Time limit: 0.5 second Memory limit: 64 MB The glorious King Hugo II has declare ...

  10. 第二章 在Html中使用JavaScript

    https://www.jianshu.com/p/8247a9401725 2.1 Script元素 https://developer.mozilla.org/en-US/docs/Web/HTM ...