【问题标题】:AOP-style Mixin Composition in ScalaScala 中的 AOP 风格的 Mixin 组合
【发布时间】:2015-03-19 21:23:53
【问题描述】:

我正在尝试使用 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")
}

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

方法运行需要 `override' 修饰符

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

方法运行需要 `abstract override' 修饰符

【问题讨论】:

    标签: scala aop mixins


    【解决方案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 
    

    【讨论】:

    • 我认为@Kolmar 的解决方案可以通过更少的特征/类获得相同的结果。尽管如此,还是谢谢你。 :)
    【解决方案2】:

    您可以做到这一点的一种方法是在类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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2017-11-30
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多