web-dev-qa-db-ja.com

共分散が問題となった場合、コードを再構成してクリーンな状態にするにはどうすればよいですか?

次のインターフェイスGameObjectEnhanceがあるとします。

GameObject

_public interface GameObject {
    void prepare();
    void use();
    void cleanup();
}
_

強化

_public interface Enhance {
    int increase();
    int decrease();
}
_

ゴーグル

_public abstract class Goggles implements GameObject, Enhance {

    // The actual implementation is unnecessary to my question. 
    // Just note that the class implements GameObject and Enhance.   
}
_

HealthPack

_public abstract class HealthPack implements GameObject {

    // The actual implementation is unnecessary to my question. 
    // Just note that the class implements GameObject.
}
_

文字

_public abstract class Character {

    private final List<GameObject> inventory;
    private final List<Goggles> goggles;
    private final List<HealthPack> health;

    public Character() {
        this.inventory = new ArrayList<GameObject>();
        this.goggles = new ArrayList<Goggles>();
        this.health = new ArrayList<HealthPack>();
    }

    public void viewInventory(){
        this.drawGrid(this.inventory);
        this.drawGrid(this.goggles); // -- BOOM!
    }

    private void drawGrid(List<GameObject> items){

    }
}
_

おそらくお気づきのとおり、List<Goggles> goggles;_と_List<HealthPack> health;_をdrawGrid(List<GameObject> items)メソッドに渡すことは できません

特定の抽象型ごとにプライベートな描画メソッドを設定できます。

_private void drawGoggles(List<Goggles> goggles)
private void drawHealthPack(List<HealthPack> healthPack)
_

しかし、これは、新しい抽象型ごとに、新しいdrawメソッドが必要になることを意味します。

たぶんGrid自体がクラスであり、グリッドのインスタンスを各GameObjectに与えることができます。グリッドのインスタンスは、Gridで使用する画像と正方形の数を渡します。このように、GameObjectがどのタイプであるかは関係ありません。グリッドクラスはImageオブジェクトのみを受け取ります。

一般的に、コードを再構成する最もクリーンな方法は何ですか?

3
user347963

変更してみてください

private void drawGrid(List<GameObject> items){
}

private void drawGrid(List<? extends GameObject> items){
}
5
Pete

わからないJava=非常によく、また試す機会もありませんが、Listをdraw *に渡すことはあまりにも具体的すぎて、メソッドも渡されたコレクションを変更します。代わりにIterable<GameObject>またはIterable<? extends GameObject>を渡した場合、他の回答が示唆するように、より正確でキャストしやすくなります。

0
max630