1

関数を使用して計算を実行するブロックがあります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には複数の異なる実装があるため、への呼び出しの前ににキャストsrcすることはできません。ABlockImplread

「隠す」ための別の方法はあり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

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 { ... }
于 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 に答える