2016-04-08 18 views
3

Generic RPG Number 3,742と書いているので、ItemsInventoryのクラスを実装しました。概念的には、Itemが1つの特定の項目です。私はItemの種類ごとにInventoryに1つのエントリしか持てないように、アイテムを積み重ねる方法を望んでいました。潜在的に役に立たないオブジェクト

Item Wrapperこれを作成するには、privateItemNumber of Itemsがあります。また、これらのすべての重量を得ることを扱ういくつかの方法があります。

これを拡張するとトラブルが発生します。私は自分自身Item WrapperクラスのほとんどすべてItemメソッドを複製したいと思う。代わりに、Itempublicを作成して、それと同じように悪いと感じるクラスInventoryを参照してください。

これはItem Wrapperが存在しないという兆候ですか?これは、Inventoryの重複項目、またはItemの概念が単数であるという問題を引き起こします。おそらくもっと良い解決策があるように感じますが、私はそれを見つけることができません。

編集:現在のクラス構造についての説明を追加する。

Player_Characterには、プライベートInventoryがあります。

Inventoryは、プライベート[ムンブル] VectorItem Wrapperである。

Item Wrapperは、プライベートItemとプライベートint "how_many"を持っていました。

「had」に注意してください。 Inventoryに拡大しているので、私はItem_NameItemに特有のものが必要であることに気付きました。デザインを変更しない場合は、ItemGet関数をすべてItem Wrapperにコピーするか、Itemをpublic(Item Wrapper)にします。

+1

あなたは 'Item'のコレクションを考えましたか?通常、ラッパーはキャンディのように単一のインスタンスを囲みます。 – maasg

+0

アイテムメソッドをラッパーに公開することは意味がありません。アイテムのコレクションはアイテムではありません。 –

答えて

4

私はあなたが問題をより複雑にしていると思っています。 quantityフィールドをItemに追加し、quantityweightを使用して合計重量を計算する方法を提供することで、問題を簡素化できます。 ItemWrapperは、追加のフィールドとメソッドでは実行できないものを追加していません。

+0

アイテムのグループを単一のアイテムとして扱いたい場合は、 'ItemWrapper'タイプが便利です(前の私の回答を参照)。 –

+0

@GregBrown質問の別の部分は、「単一項目のコンセプトは有用ですか?簡単に1つ以上の項目と置き換えることができますか?」 – RowlandB

+1

@ローランドB私はちょうど元の質問を詳しく見ました。パブリック 'ItemWrapper'型を持つのは私にとって奇妙に思えますが、プライベート' Item'型です。あなたが実際にアイテムのタイプと関連する数量だけを保存する必要がある場合、マップキーがアイテムタイプである場合、多量の型のマップを使用することができます。マップ値は、そのタイプの項目の数です。 –

5

あなたのItemWrapperタイプのサウンドは、非常に一般的なデザインパターンであるcompositeの例のようです。もしそうなら、私はそれを重複または無用とは見なしません。

+0

誰でもダウンボテックスについて説明してもらえますか? –

+0

あなたが共有したリンクは、実際に私が探しているものではない 'Tree Structures'について語ります。コンポジットデザインパターンは 'Tree'でなければなりませんか? – RowlandB

1

あなたが描いていることは何か私に叫んで、Mapがうまくいきます。なぜあなたはInventoryの実装を以下のように持っていないのですか?

public class Inventory { 

private static final int MAX_SIZE = 10; 

private final Map<Type, List<Item>> inventoryItems = new HashMap<Type, List<Item>>(); 

// Keep track of the total number of items in the inventory 
private int totalSize; 

public void add(Item item) { 

    // If the total size is greater than the max then don't allow the operation... 
    if(totalSize == MAX_SIZE){  
     throw new IllegalStateException("Exceeded maximum size"); 
    } 

    if (!inventoryItems.containsKey(item.getType())) { 
     inventoryItems.put(item.getType(), new ArrayList<Item>()); 
    } 

    inventoryItems.get(item.getType()).add(item); 

    totalSize++; 
} 

public List<Item> getItems(Type type) { 
    return inventoryItems.get(type); 
} 

public int getTotalWeight() { 

    int total = 0; 

    for (List<Item> items : inventoryItems.values()) { 
     total += calculateTotalWeight(items); 
    } 

    return total; 
} 

public int getTotalWeightByType(Type type) { 
    return calculateTotalWeight(inventoryItems.get(type)); 
} 

private int calculateTotalWeight(List<Item> items) { 
    int total = 0; 

    for (Item item : items) { 
     total += item.getWeight(); 
    } 

    return total; 
} 

public void remove(Item item) { 
    // Remove the item from inventoryItems and decrement the count 
    totalSize--; 
} 

} 

ItemWrapperクラスが不要になりました。

あなたはCharacterクラスを持っていて、その行に沿って何かを見ることができます...

public class Character { 

private final String name; 

... // Any other fields 

private final Inventory inventory; 

public Character(String name) { 
    this.name = name; 
    this.inventory = new Inventory(); 
} 

... 

public void addToInventory(Item item) { 
    inventory.add(item); 
} 

public List<Item> getItemsByType(Type type) { 
    return inventory.getItems(type); 
} 

public void removeFromInventory(Item item) { 
    inventory.remove(item); 
} 

... 

} 

注: あなたはすべての操作(おそらく不要)で、同期のオーバーヘッドがありVectorを使用していることに言及。 Map ...

+0

'Map'を使って私に何を与えるのですか? Item Wrapperのポイントは、簡単なカウントを提供するだけでなく、概念的にも計算上でもスペースを節約することです。この解決法は、現代コンピューティングの問題ではないことを計算上の助けにするものではありませんか? – RowlandB

+1

@ローランドBあなたがあなたの問題を複雑にしているように感じます。 – kstandell

+0

私は 'Map'sに精通していないので、何かを受け入れる前に私の頭を包み込むようにしています。 – RowlandB

関連する問題