Scala直通包装器

Scala直通包装器,scala,wrapper,scala-macros,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 FooWr

很多时候,我想“替换”给定对象的单个方法

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)
这适用于traits和class,并且不需要修改类型的源代码

我经常使用它,特别是在调整库或其他代码位时

这可能会因为很多方法而变得单调乏味。前几天,我想在一个实例上替换
shutdown
方法,我不得不对十几个方法进行替换


这是一个常见的习语,还是通常用另一种方式?我怀疑使用宏可以很好地实现这一点,尽管我还没有发现任何现有的宏可以做到这一点。

您可以使用宏来实现这一点

有很多库可以这样做,试试这个-

  • 请注意,这个库目前处于POC阶段,所以您可能会寻找更成熟的库。我把它放在这里是因为我认为它非常清楚地显示了这个概念
例如,您必须执行以下操作

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

继承有什么问题?类Foo2扩展了Foo{override def baz=???}@Maxim,对不起,我应该澄清一下。这不适用于接口或抽象类的类型。另外,这个实例已经在其他地方构建过了,比如在一个库中。哦…POC,嗯?它自2013年9月以来就没有更新过,所以它可能已经死了。