有以下接口类:
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
中的方法?
答案 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进行转换。