如果应该避免倾斜,我该怎么办?

时间:2016-04-05 15:11:46

标签: java casting subclass

有以下接口类:

public interface IGameObject {

    String gameObjectID();
    String gameObjectName();
    void isActionValid(String action);
    void viewActions();
}

我有以下实现上述接口的抽象类。

package gameprobjectpackage;

public abstract class Weapon implements IGameObject {
//Left out getters/setters to keep it simple
private String gameOjectID;
private String gameObjectName;
private int damage;

public Weapon(String gameOjectID, String gameObjectName,int damage) {
    super();
    this.gameOjectID = gameOjectID;
    this.gameObjectName = gameObjectName;
    this.damage = damage;
}

我发现一些帖子表明应该避免向下倾斜。我理解为什么,但是,我的问题是,如果我需要访问特定于子类的方法,我该怎么办。例如:

public class ChargeGun extends Weapon {


private String [] chargeGunActions;

public ChargeGun(String gameOjectID, String gameObjectName, int damage) {
    super(gameOjectID, gameObjectName, damage);

        chargeGunActions = new String [3];
        chargeGunActions[0] = "Charge and Fire";
        chargeGunActions[1] = "Release";
        chargeGunActions[2] = "Drop Gun";
}

//This method is only meant for gun, and this type of gun is the only one in my game.  
//This method, I don't belive should be in the abstract method weapon, because NOT every weapon is a gun.

public void reloadGun()
{

}

我存储在像这样的库存哈希映射中:

Map<String,IGameObject> inventory = new HashMap<String,IGameObject>();

当我检索它时,我会得到一个IGameObject,如何正确地投射它,以便我可以访问ChargeGun中的方法?

1 个答案:

答案 0 :(得分:5)

您可以使用visitor pattern释放您的权力。这个想法很简单:你有一个IGameObject的清单,它有一个方法accept(GameObjectVisitor v)直接调用v.visit(this)。在GameObjectVisitor中,您只需为每个实现实现访问方法:例如访问(Chargegun g),访问(Sword s)等...

以另一种方式解释,它就像回旋镖的原理:GameObjectVisitor调用item.accept(this),而Item实现了accept(GameObjectVisitor g)和一个简单的g.visit(this)。

通过这样做,访问者可以为每个实现提供多种访问方法,并且可以执行特定的操作而无需使用instanceof进行转换。