1

我有块使用函数执行计算step()。这些块可以通过 相互连接connect(Block)

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

然而,从一个具体的块实现(例如 in 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()in Block,因此无法编译。对于客户来说,“公共”块接口就足够了,我read只需要在内部。我可以添加read到 Block 界面,但对我来说这感觉不对。

由于 Block 有多种不同的实现,我不能srcABlockImpl调用read.

有没有另一种“隐藏”的方法read

4

3 回答 3

6

你可以有一个公共接口和一个包本地接口

public interface MyPublicInterface {

}

interface MyDirectInterface extends MyPublicInterface {

}

class MyImpl implements MyDirectInterface {

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

}
于 2013-01-17T14:47:14.577 回答
2

您可以在块的具体实现之间创建abstractinterface并将其命名,例如,BlockAdapter.

IE:

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 { ... }
于 2013-01-17T14:46:43.130 回答
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();
于 2013-01-17T15:16:45.500 回答