我一直在研究一個小庫存系統來練習我的OO編程。我在Netbeans中使用Java 7。設計一個遊戲的物品庫存系統並有問題
玩家將擁有一個庫存(基本物品類的ArrayList),所有創建的物品將是該物品基類的子物件。
沒有項目應該是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);
}
}
}
,這裏是一個特定項目的例子:
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
,是BaseItem
的ArrayList
的對象,允許有插了進去沒問題StackableItemExample
對象。問題是,我的庫存系統不能說BaseItem.stack()
,因爲父母不知道這種方法。
我想提出一個非常易於擴展項目系統,一個新的項目可以與極致簡約的執行和延長預創建的類和接口來創建,但是這是我的方式獲得。
我給它一個嘗試的工作,但有一個可能性有些數據會在鑄件中丟失? 我問的是,item是否還有StackableItem類的值,但在使用Item時不可見。或物品。 ()?如果是這樣,那麼這完美的作品! –
EyeOfTheHawks
是的,這正是它的工作原理(不,沒有數據會丟失)。你不會失去關於對象的額外信息 - 它的運行時類型仍然是你創建它的任何東西。除非您先將其轉換爲適當的子類,否則您無法訪問這些成員/方法。 – jedwards
太棒了,這應該完美。這樣做的任何警告?類型轉換對象似乎非常危險,但只要我們使用instanceof,我們應該可以嗎? – EyeOfTheHawks