Oop F#未定义值或构造函数,即使使用get和set

Oop F#未定义值或构造函数,即使使用get和set,oop,f#,Oop,F#,我是计算机科学一年级的学生,没有编程知识。我们刚刚完成了函数式编程,现在转向了面向对象编程。我目前正在做一项作业,我必须模仿动物之间的比赛。这些动物被赋予了一些属性和方法,这些属性和方法定义了它们的重量、最大速度等。代码的一个要求是,它必须生成一个随机变量,该变量决定了它的重量,对于调用的每个实例。到目前为止,我在代码中已经提到了这一点: let rnd = System.Random() type Animal (name:string, animalWeight:float, maxSpe

我是计算机科学一年级的学生,没有编程知识。我们刚刚完成了函数式编程,现在转向了面向对象编程。我目前正在做一项作业,我必须模仿动物之间的比赛。这些动物被赋予了一些属性和方法,这些属性和方法定义了它们的重量、最大速度等。代码的一个要求是,它必须生成一个随机变量,该变量决定了它的重量,对于调用的每个实例。到目前为止,我在代码中已经提到了这一点:

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

为了把它定义为一个变量,我尝试了(我所知有限的)一切,但似乎什么都不起作用。有人有什么想法吗?

neecessaryFoodInTake
是类成员,而不是独立的值。要引用类成员,您需要指定该类的对象,例如
x.neccessaryFoodInTake

在您的代码中,感觉您试图引用“当前”对象上的成员,该对象表示为
this
,因此您需要将其指定为对象:

member this.NeccesaryFoodIntake = 
    this.neccesaryFoodIntake <- animalWeight * FoodIntake
另一方面,如果要使用返回另一个成员值的单个getter定义属性,则不应让它修改任何内容:

member this.NeccesaryFoodIntake = this.neccesaryFoodIntake
但是那会有点没用,因为现在你有两个几乎相同的成员,除了其中一个是只读的。如果您想使
necessaryFoodIntake
从外部无法访问,然后提供
necessaryFoodIntake
作为它的公共接口,您应该将前者设置为私有的

member val private neccesaryFoodIntake = 0.0 with get, set

总而言之,虽然我可以帮助您解决特定的语法错误,但代码的其余部分似乎也有问题。

是的,由于我忘记上载整个代码,因此不清楚NeccessaryFoodInTake的作用。但最终这是一个我想要改变的变量,取决于它是哪种动物(食肉动物还是草食动物)。如果我上传整个代码,它可能会澄清我的意图:是的,不清楚NeccessaryFoodInTake做了什么,因为我忘了上传整个代码。但最终这是一个我想要改变的变量,取决于它是哪种动物(肉食动物还是草食动物)。如果我上传更多的代码,它可能会澄清一些事情:类型肉食动物(名称:string,animalWeight:float,maxSpeed:float)=类继承动物(名称,animalWeight,maxSpeed)重写此.FoodIntake=0.08结束类型Herbivore(名称:string,animalWeight:float,maxSpeed:float)=类继承动物(名称,animalWeight,maxSpeed)重写此.FoodIntake=0.4 end这些实际上不会以任何方式接触到
NecessaryFoodIntake
。@FyodorSoikin“总之,虽然我可以帮助您解决特定的语法错误,但代码的其余部分似乎也有问题。“如果OP修复了语法错误,我们很乐意在以下方面帮助他们:)我得到了一位大学学生的帮助。现在已经修好了。我想上传的代码,但似乎太长了,上传这里的一些原因。有没有办法让我上传?
member this.NeccesaryFoodIntake = this.neccesaryFoodIntake
member val private neccesaryFoodIntake = 0.0 with get, set