我怎样才能同时提供两个接口(一个"公共"和"扩展"一个)?

时间:2013-01-17 14:43:38

标签: java oop

我有块使用函数step()执行计算。块可以连接到 彼此connect(Block)

interface Block {
    void connect(Block b);
    void step();
}

然而,在具体的块实现中(例如在step中)它应该是 从连接的块可能read

class ABlockImpl implements Block {
    private Block src; // link to the block this block is connected to
    public void connect(Block b) {
        src = b;
    }

    public void step() {
        double x = src.read(); // XXX src is of type Block and there is no read() in Block
        /* ... */
    }

    public double read() {
        return 3.14;
    }
}

由于read()中没有Block,因此无法编译。对于客户端,“公共”块接口就足够了,我只需要在内部read。我可以将read添加到Block界面,但对我来说这感觉不对。

由于Block有多种不同的实现,因此在调用src之前,我无法将ABlockImpl强制转换为read

是否有其他方法可以“隐藏”read

3 个答案:

答案 0 :(得分:6)

您可以拥有公共界面和本地包

public interface MyPublicInterface {

}

interface MyDirectInterface extends MyPublicInterface {

}

class MyImpl implements MyDirectInterface {

    public void add(MyPublicInterface mpi) {
         MyDirectInterface mdi = (MyDirectInterface) mpi;
         // use mdi
    }

}

答案 1 :(得分:2)

您可以在abstract和阻止的具体实现之间创建interface图层,并为其命名,例如BlockAdapter

即:

interface Block {
    void connect(Block b);
    void step();
    double read();
}

...

public abstract class BlockAdapter implements Block { 
    double read() {
          return -1; // ? something like that
    }
}

...

public class ABlockImpl extends BlockAdapter { ... }

答案 2 :(得分:0)

我认为没有一种解决方案能够为您提供您想要的产品,但可能与您有所关系:

interface Block {
    void connect(Block b);
    void step();
}
interface ReadableBlock extends Block {
    double read();
}

方法read()仍然需要公开,但您可以让外部代码仅通过Block接口引用实现,而实现本身来自ReadableBlock

public cass ABlockImpl implements ReadableBlock {
    ....
}
Block b = new ABlockImpl();