Java 为游戏设计一个物品库存系统并有问题

Java 为游戏设计一个物品库存系统并有问题,java,inheritance,interface,polymorphism,abstract,Java,Inheritance,Interface,Polymorphism,Abstract,我一直在研究一个小的清单系统,只是为了练习我的OO编程。我在Netbeans中使用Java7 玩家将拥有一个库存(基本物品类别的ArrayList),所有创建的物品都将是该基本物品类别的子项 任何项都不应该是BaseItem类型,它们都将扩展到BaseItem类型,所以据我所知,BaseItem类应该是抽象的 public abstract class BaseItem { protected GoldValue itemValue; protected String itemN

我一直在研究一个小的清单系统,只是为了练习我的OO编程。我在Netbeans中使用Java7

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

任何项都不应该是BaseItem类型,它们都将扩展到BaseItem类型,所以据我所知,BaseItem类应该是抽象的

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

    //accessors and mutators down here
}
子项类型也将具有不同的属性,我打算将其实现为接口,例如可堆叠、可消费等

界面看起来像这样

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);
        }
    }
}
My
Inventory
BaseItem
对象的
ArrayList
,允许在其中插入
StackableItemExample
对象,这没有问题。问题是,我的库存系统不能说
BaseItem.stack()
,因为父系统不知道这种方法


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

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

任何项都不应为BaseItem类型,它们都将扩展为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 */
}

我会试一试,但是有没有可能一些数据会在铸造过程中丢失?我要问的是,item是否仍然具有StackableItem类的值,但在使用item时不可见。还是物品?如果是这样的话,那么这就完美了!是的,这正是它的工作原理(不,数据不会丢失)。您不会丢失关于对象的附加信息——它的运行时类型仍然是您创建它时所使用的类型。除非先将这些成员/方法强制转换到适当的子类,否则无法访问这些成员/方法。这样做有什么警告吗?类型转换一个对象看起来很危险,但只要我们使用instanceof,我们就应该可以了?java中的类型转换比其他语言中的类型转换“更安全”。列出的代码是处理以下情况的常用方法:您有一个基本类型的对象集合,并且希望对各种子类提供的附加功能进行操作。并且
instanceof
保护您不获取
ClassCastException
s。不幸的是,这种类型的实现可能无法与其他项属性(例如
BaseItem item = YourList.get(i);
if(item instanceof StackableItem){
    StackableItem stackable = (StackableItem)item;
    stackable.stack()  /* Now works without issue */
}