2016-12-22 6 views
4

私は最初のCS学生です。私たちは関数型プログラミングで時間を終え、オブジェクト指向プログラミングに移行しました。私は現在、動物の間でレースを模倣しなければならない課題に取り組んでいます。これらの動物には、体重、最大速度などを定義するいくつかの属性とメソッドが与えられています。コードの要件の1つは、呼び出される各インスタンスの重みを決定するランダム変数を生成する必要があることです。これまでのところ、私は私のコードでは、この時点になってきた:F#getとsetを使用しても、値またはコンストラクタが定義されていません

let rnd = System.Random() 

type Animal (name:string, animalWeight:float, maxSpeed:float) = class 

    let mutable foodInTakePercentage = float(rnd.Next(0,101)) 

    member val animalMaxSpeed : float = maxSpeed with get, set 
    member val animalWeight = animalWeight with get, set 
    member val neccesaryFoodIntake = 0.0 with get, set 
    member val Name = name 
    new (name, maxSpeed) = 
    let minWeight = 70.0 
    let maxWeight = 300.0 
    let Weight = minWeight + rnd.NextDouble() * (maxWeight-minWeight) 
    Animal (name, Weight, maxSpeed) 
    member this.FoodInTakePercentage = foodInTakePercentage/100.0 
    member this.CurrentSpeed = 
    this.FoodInTakePercentage*maxSpeed 
    abstract FoodIntake : float 
    default this.FoodIntake = 0.5 
    member this.NeccesaryFoodIntake = 
    neccesaryFoodIntake <- animalWeight * FoodIntake 

end 

type Carnivore (name:string, animalWeight:float, maxSpeed:float) = class 
    inherit Animal (name, animalWeight, maxSpeed) 
    override this.FoodIntake = 0.08 
end 

type Herbivore (name:string, animalWeight:float, maxSpeed:float) = class 
    inherit Animal (name, animalWeight, maxSpeed) 
    override this.FoodIntake = 0.4 
end 

問題はこれがコンパイルされたとき、私はエラーメッセージを受け取ることです:

10g.fsx(22,5): error FS0039: The value or constructor 'neccesaryFoodIntake' is not defined 

を私は非常に限られたのすべてを(試してみました知識)を変数として定義しようとするが、何も動かないようだ。誰にもアイデアはありますか?

答えて

4

necessaryFoodIntakeは、クラスメンバーであり、自立値ではありません。クラスメンバを参照するには、そのクラスのオブジェクトを指定する必要があります。 x.necessaryFoodIntake。あなたのコードで

あなたはthis表記される「現在」のオブジェクト、上のメンバーを参照しようとしているようそれはあなたがオブジェクトとして指定するために必要なものですので、それは、感じている:

member this.NeccesaryFoodIntake = 
    this.neccesaryFoodIntake <- animalWeight * FoodIntake 

つまり、NecessaryFoodIntakeメンバーで達成しようとしていることは完全にはっきりしていません。あなたが定義したとおり、getterを持つプロパティで、getterは実際に別のメンバ(necessaryFoodIntake)を変更し、何も返しません(つまり、unitを返します)。通常、プロパティゲッターは値を返し、状態を変更するものではありません。

内部状態を変更して何も返さないメンバーを定義する場合は、(1)プロパティではなくメソッドにし、(2)より適切な名前を付けます。一方

member this.CalculateNeccesaryFoodIntake() = 
    this.neccesaryFoodIntake <- animalWeight * FoodIntake 

あなたが他のメンバーの値を返す単一ゲッターとプロパティを定義したい場合、あなたはそれが何かを変更してはならない。

member this.NeccesaryFoodIntake = this.neccesaryFoodIntake 

しかし、それは次のようになりますちょっと役に立たない。なぜなら、2人のメンバーがほぼ同じだからです。あなたはそれのためのパブリックインターフェイスとしてNecessaryFoodIntakeを外部からnecessaryFoodIntakeにアクセスできないようして、提供したい場合は、旧private作っておく必要があります。要するに

member val private neccesaryFoodIntake = 0.0 with get, set 

、私はあなたの特定の構文エラーのお手伝いをすることができながら、残りのコードも同様に見えます。

+0

はい、私はコード全体をアップロードするのを忘れてしまったので、NeccesaryFoodIntakeの動作は不明です。しかし、最終的には、私が変更したい変数は、それが動物の種類(肉食動物か野生動物か)に依存します。コード全体をアップロードすれば、おそらく私の意図を明確にします: – VanTheMan

+0

はい、NeccesaryFoodIntakeは何をしていますか?コード全体をアップロードします。しかし、最終的には、私が変更したい変数は、動物の種類(肉食動物か野生動物か)によって異なります。コードをさらにアップロードすると、おそらく事を明確にすることができます: 型Carnivore(name:string、animalWeight:float、 maxSpeed:フロート)=クラス 継承動物(名前、animalWeight、maxSpeed) オーバーライドthis.FoodIntake = 0.08 エンド型草食動物(名称:文字列、animalWeight:フロート、maxSpeed:フロート)=クラス 継承動物(名前、end – VanTheMan

+0

これらは実際には「NecessaryFoodIntake」に触れません。 –

関連する問題