Scala中的AOP风格的Mixin组合

时间:2015-01-21 11:15:15

标签: scala aop mixins

我试图使用mixins来获得类似AOP /拦截器的编程风格。

这是我的代码:

trait X {
  def run
}

trait Y extends X {
  abstract override def run = {
    println("hi")
    super.run
  }
}

object Z extends X with Y {
  def run = println("bye")
}

尝试编译时出现以下错误:

  

方法运行需要`覆盖'改性剂

我在这里做错了什么?我试图添加'覆盖'修饰符,但它给了我:

  

方法运行需要`抽象覆盖'改性剂

2 个答案:

答案 0 :(得分:4)

您可以这样做的一种方法是在扩展基座A的类X中定义基本功能,并提供混合AY的对象(或类) trait X { def run } trait Y extends X { abstract override def run = { println("hi") super.run } } class A extends X { def run = println("bye") } object Z extends A with Y (以及您可能定义的所有其他特征):

Z.run

hi bye 将打印

{{1}}

答案 1 :(得分:1)

您应该创建基本抽象类:

abstract class A {
  def run
}

然后用X或Y扩展它:

trait X extends A /* OR trait Y extends A */ {
  def run
}

trait Y /*extends A*/ extends X {
  abstract override def run = {
    println("hi")
    super.run
  }
}

然后将Z.run移到超类:

class S extends A {
  def run = println("bye")
}

object Z extends S with X with Y {
  //override def run = println("bye")
}

Z.run
// hi
// bye