zoukankan      html  css  js  c++  java
  • 12-5 作为可叠加修改的特质

    定义一个抽象的IntQueue类

    abstract class IntQueue {
      def get(): Int
      def put(x: Int)
    }
    

    IntQueue的基本实现BasicIntQueue

    class BasicIntQueue extends IntQueue {
      private val buf = new ArrayBuffer[Int]
    
      override def get(): Int = buf.remove(0)
    
      override def put(x: Int): Unit = buf += x
    }
    

    特质Doubling:将所有放入队列的整数翻倍

    ①extends IntQueue 这个声明意味着这个特质只能被混入同样继承自IntQueue的类。

    ②super 由于特质中的super调用是动态绑定的,只要在给出了该方法具体定义的特质或类之后混入,Doubling特质里的super调用就可以正常工作。

    ③abstract override 这样的修饰符组合只允许用在特质的成员上,不允许用在类的成员上,它的含义是该特质必须混入某个拥有该方法具体定义的类中。

    trait Doubling extends IntQueue{
      abstract override def put(x: Int): Unit = super.put(2 * x)
    }
    

    特质Incrementing:将所有放入队列的整数加一

    trait Incrementing extends IntQueue {
      abstract override def put(x: Int): Unit = super.put(x + 1)
    }
    

    特质Filtering:从队列中去除负整数

    trait Filtering extends IntQueue {
      abstract override def put(x: Int): Unit = if (x >=0) super.put(x)
    }
    

    测试1:粗略地讲,越靠右出现的特质越先起作用,如果那个方法调用super,它将调用左侧紧挨着它的那个特质的方法,以此类推。在下面的代码中,先调用Filtering的put最先被调用,所以它首先过滤掉了那些负的整数。Incrementing的put排在第二,因此它做的事情就是在Filtering的基础上对剩下的整数加1

    def main(args: Array[String]): Unit = {
      val queue = new BasicIntQueue with Incrementing with Filtering
      queue.put(-1)
      queue.put(0)
      queue.put(1)
      println(queue.get()) //1
      println(queue.get()) //2
    }
    

    测试2:与测试1的特质混入顺序相反

    def main(args: Array[String]): Unit = {
      val queue = new BasicIntQueue with Filtering with Incrementing
      queue.put(-1)
      queue.put(0)
      queue.put(1)
      println(queue.get()) //0
      println(queue.get()) //1
      println(queue.get()) //2
    }
    
  • 相关阅读:
    Windows JScript 在 游览器 中运行 调试 Shell 文件系统
    autohotkey 符号链接 软连接 symbolink
    软链接 硬链接 测试
    SolidWorks 修改 基准面 标准坐标系
    手机 路径 WebDAV 映射 驱动器
    Win10上手机路径
    explorer 命令行
    单位公司 网络 封锁 屏蔽 深信 AC
    cobbler自动化部署原理篇
    Docker四种网络模式
  • 原文地址:https://www.cnblogs.com/noyouth/p/14092247.html
Copyright © 2011-2022 走看看