0

我一直在研究一个小库存系统,只是为了练习我的 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);
    }


}

My Inventory,作为一个ArrayList对象BaseItem,被允许将一个StackableItemExample对象插入其中没有问题。问题是,我的库存系统不能说BaseItem.stack(),因为父母不知道这种方法。

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

4

2 回答 2

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 */
}
于 2013-09-24T19:27:28.747 回答
0

使每个物品都可堆叠 - 当前不可堆叠的物品的堆叠大小应为 1。然后,您可以摆脱可堆叠的抽象类和接口,将该功能放入基类中。

于 2013-09-24T19:25:59.350 回答