2

が存在しますinterface Algorithm

ありclass MathAlgorythm implements Algorithm (returns MathResult, which implements Result

ありclass ChemitryAlgorythm implements Algorithm (returns ChemitryResult, which implements Result

Context classさらに、これらのアルゴにデータを渡すために使用されるが存在します。データは次の方法で渡されます。

public Result executeStrategy(Data data) {
    return algo.execute(data);
}

私が executeStrategy を実行して戻ってきた としreturn MathAlgorithm.execute(data);ます。結果型の何かが得られますよね?

次に実行し return ChemitryAlgorithm.execute(data);ます もう一度何か結果を取得します

質問: 結果はインターフェースです。MathResult または ChemistryResult として具象クラスの実装にアクセスする必要があります。言い換えると。Result 型の何かを取得したら、さらに深く掘り下げて、インターフェイスの背後に隠れているクラスを知る必要があります

このとりとめのない話があまり混乱しないことを願っています。

読んで回答していただきありがとうございます

4

4 に答える 4

2

Result具体的な実装が実装する必要があるようなメソッドを指定する場合T get()、具体的な実装について知る必要はありません。

于 2010-12-29T23:51:36.120 に答える
0

私があなたの質問を理解したかどうかはわかりませんが、インスタンスの具体的なクラスを知るには、getClass() を使用するか、代わりに instanceof を使用して、それが MathResult などであるかどうかを確認します。Result インターフェイスの実装のポイント全体を無効にしないように注意してください。

于 2010-12-29T23:56:33.483 に答える
0

どうですか:

interface Algorithm<R extends Result, D extends Data> {
  T execute data(D data);
}

MathAlgorithm の実装は次のようになります。

class MathAlgorithm implements Algorithm<MathResult, MathData> {
  public MathResult execute(MathData data) {
    // do whatever
    return <instance of MathResult>;
  }
}

使用法:

MathResult mathResult = new MathAlgorithm().execute(someMathData);
于 2010-12-30T00:17:05.200 に答える
0

Result インターフェイスがすべてのクライアントを満足させるのに十分強力であることを確認してください。これが、ポリモーフィックな透明性を壊さないようにするための鍵です。

本当に、本当に本当に具体的な型を知る必要がある場合は、getClass、ある種の一意の ID とゲッターを使用するか、(最も望ましい) 動作を具体的な Result クラスの操作に吸収することができます。

于 2010-12-30T00:02:13.577 に答える