Scala中的AOP风格混合成分

Scala中的AOP风格混合成分,scala,aop,mixins,Scala,Aop,Mixins,我正在尝试使用mixin来获得类似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") } 我在尝试编译时遇到以下错误: 方法运行需要“重写”修饰符 我做错了什么?我试图添

我正在尝试使用mixin来获得类似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")
}
我在尝试编译时遇到以下错误:

方法运行需要“重写”修饰符

我做错了什么?我试图添加“覆盖”修饰符,但它给了我:

方法运行需要“抽象重写”修饰符


一种方法是在类
a
中定义基本功能,扩展基本
X
,并提供混合
a
Y
的对象(或类)(以及您可以定义的所有其他特征):

Z.run
将打印

hi
bye

您应该创建基本抽象类:

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 

我认为@Kolmar的解决方案可以得到相同的结果,但特征/类别更少。尽管如此,谢谢你。:)
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