假设我有第三方Java接口和装饰器:
interface Foo {
void doSomething();
}
class DecoratedFoo implements Foo {
private final Foo foo;
public DecoratedFoo(Foo foo) { this.foo = foo; }
@Override
public void doSomething() {
...
foo.doSomething()
}
}
现在,假设我要创建名为DecoratedFoo
的{{1}}的“Scala-fied”版本(因此,我可以创建一个Decorated
或者某些人):
new FooImpl with Decorated
问题当然是,如果你有一个trait Decorated { self: Foo =>
val wrapper = new DecoratedFoo(self)
abstract override def doSomething() = wrapper.doSomething()
}
的实例,那么对Foo with Decorated
的调用将无限递归,因为授权给doSomething()
和{{1我自己的内部wrapper
。如何破解这种递归?
如果我们在这些行中有第二个类似的Java装饰器,比如DecoratedFoo
和第二个Scala特征doSomething()
,那么对此进行跟进。是否可以让Scala的Decorated2Foo
表现得与Java的Decorated2
类似?