Scala 中 AOP 风格的 Mixin 组合

AOP-style Mixin Composition in Scala

我正在尝试使用 mixins 来获得 AOP/interceptor-like 编程风格。

这是我的代码:

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")
}

我在尝试编译时遇到以下错误:

method run needs `override' modifier

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

method run needs `abstract override' modifiers

一种方法是在 class A 扩展基础 X 中定义基础功能,并提供一个对象(或 class) 混合了 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

您应该创建基础摘要 class:

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移动到super class:

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