Scala传递包装器

时间:2014-11-30 21:33:59

标签: scala wrapper scala-macros

很多次,我想要“替换”给定对象的单个方法。

foo: Foo
foo.bar(i) // original
foo.baz(s) // replace this implementation

我最终会创建一个传递包装类。

class FooWrapper(foo: Foo) extends Foo {
  def bar(i: Int) = foo.bar(i)
  def baz(s: String) = foo.baz(s)
}

然后

foo: Foo
val foo2 = new FooWrapper(foo) { def baz(s: String) = ... }
foo2.bar(i)
foo2.baz(s)

这适用于特征和类,无需修改类型的源代码即可工作。

我使用了这一点,特别是在调整库或其他代码时。

这可能会让很多方法变得乏味。前几天,我想替换ExecutorService实例上的shutdown方法,我必须为十几种方法执行此操作。

这是一种常见的习语,还是通常以另一种方式完成?我怀疑这可以通过宏很好地完成,但我还没有找到任何现有的。

1 个答案:

答案 0 :(得分:3)

您可以使用AOP (Aspect-oriented programming)

实现这一目标

有很多图书馆可以这样做,试试这个 - https://github.com/adamw/scala-macro-aop

  • 请注意,此库现在处于POC阶段,因此您可能会寻找更成熟的内容。我把它放在这里因为我认为它非常清楚地显示了这个概念。

对于您的示例,您必须执行类似

的操作
class FooWrapper(@delegate wrapped: Foo) extends Foo {
  def baz(i: Int) = ???
}