3

我有类实现了多个具有相同默认默认方法的接口。我想知道如何从所有接口组合默认方法。例如:

interface IA {
    default void doA() {} 
    default void process() { 
        // do something 
    }
}

interface IB { 
    default void doB() {}
    default void process() { 
        // do something 
    }
}

interface IC {
    default void doC() {} 
    default void process() { 
        // do something 
    }
}

// other similar interfaces
....    

class MyClass implements IA, IB, IC, ... {
    public void process() {
       // question: how to avoid iterate all the interfaces? 
       IA.super.process();       
       IB.super.process();
       IC.super.process();
       ...
    }
}

class AnotherClass implements IA, ID, IF, IH, ... {
    public void process() {
        IA.super.process();
        ID.super.process();
        IF.super.process();
        IH.super.process();
        ...
    }
}

在实现中,该方法只是process()从所有接口合成。但是我必须明确地调用IA.super.process(), 。如果接口列表很长,把它们都写出来是很痛苦的。此外,我可能有不同的类来实现不同的接口组合。是否有其他语法糖/设计模式/库可以让我自动完成?IB.super.process()IC.super.process()

更新:与复合模式比较

复合图案也相当可观。但是我想使用默认方法作为 mixin 来为类提供不同的行为,而复合模式在这里没有给我静态类型检查。复合模式还引入了额外的内存占用。

4

1 回答 1

7

我认为您的错误是定义了多个实际上相同的接口(除了不同的默认行为)。在我看来这似乎是错误的并且违反了DRY

我将使用复合模式来构建它:

interface Processable
{
    void process();
}
public interface IA extends Processable //and IB, IC etc.
{
    default void doA()
    {
        // Do some stuff
    }
}


final class A implements IA
{
    void process() { /* whatever */ }
}


class Composite implements IA //, IB, IC etc. 
{
    List<Processable> components = Arrays.asList(
         new A(), new B(), ...
    );

    void process()
    {
         for(Processable p : components) p.process();
    }
}
于 2017-03-29T10:07:40.217 回答