2013-09-24 47 views
0

我一直在研究一個小庫存系統來練習我的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,是BaseItemArrayList的對象,允許有插了進去沒問題StackableItemExample對象。問題是,我的庫存系統不能說BaseItem.stack(),因爲父母不知道這種方法。

我想提出一個非常易於擴展項目系統,一個新的項目可以與極致簡約的執行和延長預創建的類和接口來創建,但是這是我的方式獲得。

回答

2

沒有項目應該是BaseItem類型,它們都會延伸,所以據我的理解,BaseItem類應該是抽象的?

  • 移動stack()到你的基類,並給它一個默認的實現:

    如果你想BaseItem.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 */ 
} 
+0

我給它一個嘗試的工作,但有一個可能性有些數據會在鑄件中丟失? 我問的是,item是否還有StackableItem類的值,但在使用Item時不可見。 或物品。 ()?如果是這樣,那麼這完美的作品! – EyeOfTheHawks

+0

是的,這正是它的工作原理(不,沒有數據會丟失)。你不會失去關於對象的額外信息 - 它的運行時類型仍然是你創建它的任何東西。除非您先將其轉換爲適當的子類,否則您無法訪問這些成員/方法。 – jedwards

+0

太棒了,這應該完美。這樣做的任何警告?類型轉換對象似乎非常危險,但只要我們使用instanceof,我們應該可以嗎? – EyeOfTheHawks

0

使每一個項目可堆疊 - 目前unstackable項目應該有一個的堆棧大小。然後,您可以擺脫可堆疊的抽象類和接口,將該功能放入基類中。

+0

不幸的是,這種類型的實現可能不會與其他項目屬性,如食用 – EyeOfTheHawks