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

播放器将具有一个清单(基本Item类的ArrayList),创建的所有项目都是该基本Item类的子级。

没有项目应该是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的子级之一,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);
    }


}


我的InventoryArrayList对象的BaseItem,可以将StackableItemExample对象插入其中。问题是,我的库存系统无法说出BaseItem.stack(),因为父母不知道这种方法。

我想创建一个非常容易扩展的项目系统,可以通过实现和扩展预先创建的类和接口以极其简单的方式创建一个新项目,但是这很麻烦。

最佳答案

没有项目应该是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 */
}

10-06 13:08