在子类中的另一个函数的每个实现中自动调用函数而不显式调用

时间:2016-03-03 13:07:40

标签: scala inheritance typeclass implicit

我有类似下面的代码。我想在每个bar函数的末尾添加一些代码,例如foo。我想我可能需要使用type类和implicitabstract override。有什么想法吗?提前谢谢。

trait A {
  def foo = { //do something }
}


case class B() extends A {
  def bar = {
    // do other stuff
    // automatically call foo
  }
}

case class C() extends A {
  def bar = {
    // do different stuff
    // automatically call foo
  }
}

3 个答案:

答案 0 :(得分:1)

您无法自动拨打电话。编译器应该如何知道要调用什么?魔法?

你可以impl。默认bar并致电super.bar

def bar = foo
....
def bar = {
//do stuff
super.bar
}

但除非bar调用多个方法,否则这是无用的。

答案 1 :(得分:1)

听起来你在面向方面的编程中正在寻找类似after的东西。在任何OO语言中执行此操作的最简单方法是遵循公共方法始终是最终的规则。这将基类和派生类之间的接口与基类和调用者之间的接口分开。那就是:

trait A {
    private def foo = { }
    protected def on_bar = { }
    final def bar = { on_bar; foo; }
};

case class B() extends A {
    def on_bar = { do_other_stuff; }
}

答案 2 :(得分:0)

不完全清楚你的目标是什么,但听起来与stackable trait pattern类似。看看并判断它是否是您想要的东西,在这种情况下,我可以提供更多信息,即使该文章非常明显。