2016-08-26 4 views
1

私はStrategyパターンを実装しています:のJava、戦略パターン、ジェネリックおよび戻り値の型

public interface Stuff<T> { 
    T getStuff(); 
} 

public class IntegerStuff implements Stuff<Integer> { 
    public Integer getStuff() { .. } 
} 

public class StringStuff implements Stuff<String> { 
    public String getStuff() { .. } 
} 

は今、私は戦略を設定し、戦略メソッドを実行するために「コンテキスト」を使用したいです

public class Context() { 
    private Stuff stuff; 
    public setStrategy(Stuff stuff) { this.stuff = stuff; } 

    public Object doStuff() { // ARGH! 
     return stuff.getStuff() 
    } 
} 

コンテキストクラスのdoStuff()メソッドのタイプが、使用されている戦略と同じタイプになるように、ジェネリックを使用するにはどうすればよいですか?あなたにもContextをパラメータ化したい

+1

戦略パターンは、ブラックボックスの動作の種類を可能にします。あなたは定義された入力と定義された出力を持っていますが、その間に何が起こったのか(これは交換可能でなければならない)戦略を決定します。あなたのメソッドの出力を変更したいと思うので、私は戦略パターンが正しい選択ではないと思います – CRC

+0

@CRC、そうです、私はあなたが正しいと思います。戻り値の型が "契約"を変更します – Luciano

+1

これは別の方法あなたはこれで何をしようとしていますか? – Fildor

答えて

3

public class Context<T> { 
    private Stuff<T> stuff; 
    public setStrategy(Stuff<T> stuff) { this.stuff = stuff; } 

    public T doStuff() { // ARGH! 
     return stuff.getStuff() 
    } 
} 
+0

この場合(戦略パターン)、これは機能しません。 私は戦略クラスのタイプでコンテキストを作成する必要はありません! 'Context c =新しいコンテキスト<>();' – Luciano

+0

@ルシアノ:「これは機能しません」とはどういう意味ですか?それはなぜ機能しないのですか? –

+0

この場合、出力タイプがわかりません。したがって、返された値がオブジェクトであることだけを確認することができますが、それ以外のものはありません。したがって、出力を制限するかどうか、または戻り値の型としてObjectを使用するかどうかを決めることができます。 – CRC

関連する問題