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