我一直在研究一个小库存系统,只是为了练习我的 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()
,因为父母不知道这种方法。
我想制作一个非常容易扩展的项目系统,通过实现和扩展预先创建的类和接口,可以非常简单地创建一个新项目,但这妨碍了我。