次のインターフェイスGameObject
とEnhance
があるとします。
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
オブジェクトのみを受け取ります。
一般的に、コードを再構成する最もクリーンな方法は何ですか?
変更してみてください
private void drawGrid(List<GameObject> items){
}
に
private void drawGrid(List<? extends GameObject> items){
}
わからないJava=非常によく、また試す機会もありませんが、Listをdraw *に渡すことはあまりにも具体的すぎて、メソッドも渡されたコレクションを変更します。代わりにIterable<GameObject>
またはIterable<? extends GameObject>
を渡した場合、他の回答が示唆するように、より正確でキャストしやすくなります。