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. codevs——1430 素数判定

    1430 素数判定  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description 质数又称素数.指在一个大于1的自然数中, ...

  2. something interesting when read docs

    When you kill a session with "ALTER SYSTEM KILL SESSION  '' ". If the session is performin ...

  3. cc2540 usbdongle 安装驱动失败的终极解决方法 【原创,多图】

    Ghost winxp win7系统安装CC2540 usbdongle CDC驱动程序 [重要提示] 因为非常多朋友使用Ghost系统.导致安装cdc驱动时安装不成功,出现 "INF中的服 ...

  4. LeetCode 266. Palindrome Permutation (回文排列)$

    Given a string, determine if a permutation of the string could form a palindrome. For example," ...

  5. Codeforces Round #325 (Div. 2) B. Laurenty and Shop 前缀+后缀

                                                                                 B. Laurenty and Shop   ...

  6. ios7--UIImageView

    // // ViewController.m // 03-UIImageView的使用 // #import "ViewController.h" @interface ViewC ...

  7. B1072 [SCOI2007]排列perm 状压dp

    很简单的状压dp,但是有一个事,就是...我数组开大了一点,然后每次memset就会T,然后开小就好了!!!震惊!以后小心点这个问题. 题干: Description 给一个数字串s和正整数d, 统计 ...

  8. fprintf与stderr、stdout的使用

    #include <stdio.h> void main() { fprintf(stderr,"soyo8888!"); fprintf(stdout,"s ...

  9. linux下打开windows txt文件中文乱码问题 (转载)

    转自:http://blog.csdn.net/imyang2007/article/details/7448177 在linux操作系统下,我们有时打开在windows下的txt文件,发现在wind ...

  10. struts2基础学习----struts.xml配置文件

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "- ...