2016-11-22 1 views
-1

Beim Definieren eines Inventarsystems für ein RPG-Spiel stieß ich auf ein seltsames Problem. Also, was ich versuche, ist, Dinge hinzuzufügen, die ein Spieler von einem Laden bekommen würde. Während ich hinzufüge, bin ich sicher, dass ich nicht über das Gewichtslimit gehe und die Menge eines Artikels erhöhen würde, wenn es bereits in meiner Inventurtasche wäre, ansonsten werde ich den Artikel einfach hinzufügen.IntelliSens erkennt die Typeigenschaft beim Aktualisieren des Wertwerts nicht

So weit so gut, das sieht ziemlich gesund aus. Mein Problem ist, wenn ich meine abstrakte Klasse aktualisiere, versucht IntelliSens mir zu sagen, dass ich diese Eigenschaft nicht für den Typ definiere, den ich verwende. Tatsächlich kann es nichts von der Eigenschaft der abstrakten Klasse finden. Könnte ein böser Fehler sein, aber ich habe mir schon seit einiger Zeit den Kopf darüber gekratzt und ich hätte gerne Unterstützung!

UPDATE

hier ist der Kompilierung Fehler: Der Typ 'InventoryItem' kein Feld 'Menge' enthält .. \ 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

Zuerst sieht Ihr Einzug aus, bitte korrigieren Sie es. Zweitens, bitte erläutern Sie, welchen Fehler Sie bekommen, wo, wann oder auf welche Weise wissen Sie, dass "es nicht funktioniert". –

+1

Ich machte einige Änderungen @FyodorSoikin. Wie bereits erwähnt, scheint der Compiler mein Mengenfeld nicht innerhalb der InventoryItem-abstrakten Klasse zu sehen. –

+1

Ihre Einrückung ist immer noch deaktiviert. Und "scheint nicht zu sehen" ist keine gute Beschreibung eines Problems. –

Antwort

3

Die with keyword Werke mit nur Aufzeichnungen. Sie versuchen, es in einer Klasse zu verwenden.

Sie möchten möglicherweise zu einem record wechseln, wenn Sie immer InventoryItem auf Änderung kopieren möchten, wie Sie bereits mit Inventory tun.

+0

Wie müsste ich gehen, wenn ich noch eine abstrakte Klasse aktualisieren möchte? Ich verstehe, was du sagst, aber es gibt einen Weg? –

+0

Wenn Sie bei Änderung kopieren müssen, können Sie eine abstrakte 'With'-Methode verwenden, die das Objekt klont und optionale Parameter zum Ändern bestimmter Felder im Klon enthält. Aber jede Kindklasse müsste ihre eigene With-Methode implementieren. Es ist eine Menge Standard. Ich würde die Verwendung einer abstrakten Klasse oder sogar Klassen überhaupt überdenken, wenn C# interop nicht benötigt wird. – TheQuickBrownFox

+0

Hmmm, stieß auf diese: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/object-expressions Das hätte eine bessere Antwort als das, was Sie mir zur Verfügung gestellt haben. Es ist genau die Funktionalität, nach der ich gesucht habe. Ich verstehe, warum die Verwendung von DU und Aufzeichnungen in F # großartig ist, aber ich suchte nach einer Antwort, die die Erstellung meines Typs abdeckt. –

Verwandte Themen