我一直在研究一个小库存系统,只是为了练习我的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
作为ArrayList
个BaseItem
个对象,可以插入StackableItemExample
个对象,没问题。问题是,我的库存系统不能说BaseItem.stack()
,因为父母不知道这种方法。
我想创建一个非常容易扩展的项目系统,通过实现和扩展预先创建的类和接口,可以极其简单地创建一个新项目,但这会妨碍我。
答案 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)
使每个项目都可堆叠 - 当前不可堆叠的项目应该具有一个堆栈大小。然后,您可以摆脱可堆叠的抽象类和接口,将该功能放入基类。