• 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的类的父类。

      

  • 相关阅读:
    Python 函数与函数式编程
    Python 字符编码与转码
    Python 读写txt文件操作
    两阶段事务总结
    MPPDB集群高可用设计
    MPPDB中的各个组件
    IntelliJ IDEA2016学习小结
    mysql免安装版配置
    理想的智能机
    java对象的大小
  • 原文地址:https://www.cnblogs.com/haisongvip/p/9539306.html
Copyright © 2020-2023  润新知