2016-11-22 5 views
-1

RPGゲームのインベントリシステムを定義する際に、私は奇妙な問題に遭遇しました。それで、私がやっていることは、プレーヤーが店から手に入れるアイテムを追加することです。追加している間、私は重量制限を超えないようにして、アイテムが既に袋に入っていればアイテムの数量を増やします。そうしないとアイテムを明示的に追加します。IntelliSensは、不変の値を更新中にタイププロパティを検出しません。

これまでのところ、これは非常にうまくいきました。私の問題は、抽象クラスを更新しているときに、IntelliSensが私が使用しているタイプのプロパティ定義を持っていないことを教えようとします。実際には、抽象クラスのプロパティを見つけることはできません。悪い間違いかもしれませんが、私はかなり長い間、これを頭で掻いてきました。私はいくつかのサポートをしたいと思います!

UPDATE

はここにコンパイルエラーになります:型 'InventoryItem' フィールドが含まれていません '数量' .. \ InventoryItems.fs 188

[<AbstractClass>] 
    type InventoryItem() = 

    abstract member ItemName : string 

    abstract member ItemDescription : string 

    abstract member ItemWeight : float<kg> 

    abstract member ItemPrice : float<usd> 

    abstract member Quantity : int with get, set 


    let makeBagItemsDistinct (bag: InventoryItem array) = 
    bag |> Seq.distinct |> Seq.toArray 

    type Inventory = { 
     Bag : InventoryItem array 
     Weight: float<kg> 
    } 

    with 
     member x.addItem (ii: InventoryItem): Inventory = 
      if x.Weight >= MaxWeight <> true then x 
      elif (x.Weight + ii.ItemWeight) >= MaxWeight then x 
      else 
       let oItemIndex = x.Bag |> Array.tryFindIndex(fun x -> x = ii) 
       match oItemIndex with 
       | Some index -> 
        // There already an item of this type in the bag 
        let item = x.Bag |> Array.find(fun x -> x = ii) 
        let newBag = 
         x.Bag 
         |> Array.filter((<>) item) 
         |> Array.append [| { item with Quantity = item.Quantity +ii.Quantity |] 
         |> makeBagItemsDistinct 

        let inventory = { x with Bag = newBag } 
        { inventory with Weight = inventory.Weight + item.ItemWeight } 
       | None -> 
        let newBag = x.Bag |> Array.append [|ii|] |> makeBagItemsDistinct 
        let inventory = { x with Bag = newBag } 
        { inventory with Weight = inventory.Weight + ii.ItemWeight } 
+1

まず、字下げが見えます。修正してください。第2に、どのようなエラーが発生しているのか、どこで、いつ、それともそうでなければ「それは機能していない」ことをどのように知っているのかを説明してください。 –

+1

私はいくつかの変更を加えました@FyodorSoikin。前述のように、コンパイラはInventoryItem抽象クラス内にQuantityフィールドを表示していないようです –

+1

インデントがまだオフです。そして、「見えない」とは、問題の説明ではありません。 –

答えて

3

レコードだけでwith keyword作品。あなたはクラスでそれを使用しようとしています。

Inventoryで既に行っているように、いつでもInventoryItemを変更してコピーしたい場合は、recordに切り替えることができます。

+0

まだ抽象クラスを更新したい場合、どうすればいいですか?私はあなたが言っていることを理解していますが、確かに、方法がありますか? –

+0

変更をコピーする必要がある場合は、抽象的な 'With'メソッドを使用してオブジェクトをクローンし、クローン内の特定のフィールドを変更するためのオプションのパラメータを持つことができます。しかし、各子クラスは独自の 'With'メソッドを実装する必要があります。それは多くの定型文です。 C#interopが必要ない場合は、抽象クラス、あるいはクラスの使用を再考します。 – TheQuickBrownFox

+0

うん、これを見つけた:https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/object-expressions それはあなたが私に提供したものよりも良い答えをしただろう。それはまさに私が探していた機能です。なぜDUとレコードを使うのがF#ですばらしいのか理解していますが、私は自分のタイプの作成をカバーする答えを探していました。 –

関連する問題