为游戏设计物品库存系统并遇到问题

时间:2013-09-24 19:17:34

标签: java inheritance interface polymorphism abstract

我一直在研究一个小库存系统,只是为了练习我的OO编程。我在Netbeans中使用Java 7。

玩家将拥有一个库存(基本物品类的ArrayList),所有创建的物品都将是该基本物品类的子物。

没有项目应该是BaseItem类型,它们都会延伸到那个,所以根据我的理解,BaseItem类应该是抽象的吗?

public abstract class BaseItem {
    protected GoldValue itemValue;
    protected String itemName;

    //accessors and mutators down here
}

子项类型也将具有不同的属性,我将作为接口实现,例如Stackable,Consumable等。

界面看起来像这样

public interface Stackable {   

    public void stack (StackableItem bi1);

}

正如你所看到的,我在这里引用了StackableItem,这是BaseItem的子代之一,它也是抽象的,特定的项目将构建出来。

public abstract class StackableItem extends BaseItem implements Stackable{

    protected int quantity;
    protected int maxStacks;

    @Override
    public void stack (StackableItem si)
    {
        if(this.getQuantity() + si.getQuantity() < maxStacks){
            this.setQuantity(this.getQuantity()+si.getQuantity());
            si.setQuantity(0);
        }
        else if(this.getQuantity() + si.getQuantity() > maxStacks){
            int diff = maxStacks - this.getQuantity();
            this.setQuantity(this.getQuantity() + diff);
            si.setQuantity(si.getQuantity() - diff);
        }
    }
}

以下是特定项目的示例:

public class StackableItemExample extends StackableItem{

    public StackableItemExample ()throws GoldException
    {
        this(new GoldValue(0,0,0), "unnamed", 1);
    }
    public StackableItemExample(GoldValue gv, String name, int quan) throws GoldException
    {
        this.itemValue = gv;
        this.itemName = name;
        this.quantity = quan;
        this.maxStacks = 10;
        this.itemValue.setGoldValue(gv.getGold()*quan, gv.getSilver()*quan, gv.getCopper()*quan);
    }


}

我的Inventory作为ArrayListBaseItem个对象,可以插入StackableItemExample个对象,没问题。问题是,我的库存系统不能说BaseItem.stack(),因为父母不知道这种方法。

我想创建一个非常容易扩展的项目系统,通过实现和扩展预先创建的类和接口,可以极其简单地创建一个新项目,但这会妨碍我。

2 个答案:

答案 0 :(得分:2)

没有项目应该是BaseItem类型,它们都会延伸到那个,所以根据我的理解,BaseItem类应该是抽象的吗?

听起来不错


如果你想BaseItem.stack()工作,你至少可以做两件事:

  • stack()移动到基类中,并为其提供无效的默认实现。然后在StackableItem类中重写它,或
  • 使用instanceof查看BaseItem是否为StackableItem,然后将其转换为StackableItem并从那里开始。

第二种方法如下:

BaseItem item = YourList.get(i);
if(item instanceof StackableItem){
    StackableItem stackable = (StackableItem)item;
    stackable.stack()  /* Now works without issue */
}

答案 1 :(得分:0)

使每个项目都可堆叠 - 当前不可堆叠的项目应该具有一个堆栈大小。然后,您可以摆脱可堆叠的抽象类和接口,将该功能放入基类。