很多次,我想要“替换”给定对象的单个方法。
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
方法,我必须为十几种方法执行此操作。
这是一种常见的习语,还是通常以另一种方式完成?我怀疑这可以通过宏很好地完成,但我还没有找到任何现有的。
答案 0 :(得分:3)
您可以使用AOP (Aspect-oriented programming)
实现这一目标有很多图书馆可以这样做,试试这个 - https://github.com/adamw/scala-macro-aop
对于您的示例,您必须执行类似
的操作class FooWrapper(@delegate wrapped: Foo) extends Foo {
def baz(i: Int) = ???
}