Scala的可堆叠特征和Java装饰器

时间:2015-12-30 07:49:13

标签: java scala decorator traits

假设我有第三方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类似?

0 个答案:

没有答案