类必须是抽象的,因为它的成员没有实例化



我正在尝试创建一个具有参数"值"和"维度"的类鼠。老鼠有一个成员"健身"。我希望这个成员由构造函数初始化,但声明这个成员会强制它被显式实例化。

这是一只具有会员健身的类鼠。我已经声明但未定义成员,因为我想通过构造函数获取它。

class rat(value:Int,dimensions:Int){
   var fitness:Int
   def rat(){
      fitness=sol_fit()
   }
   def sol_fit():Int={
      var f=value*dimensions
      f 
   }
}

对于一个类来说,这看起来是一个非常糟糕的设计。我几乎质疑它的一切。但是编译它很容易:只需给var一个默认值。

var fitness:Int = _

现在它可以编译,但fitness的值将保持默认值(在本例中0),因为您已经定义了计算正确适应度值的方法,但从未调用过它,因此fitness值保持不变。

但实际上,为什么要经历所有的繁琐工作?为什么不直接用计算值初始化它呢?为什么不var fitness:Int = sol_fit()或干脆var fitness:Int = value*dimensions

构造函数是类声明后面的块,所以可以这样写:

class rat(value: Int, dimensions: Int) {
  val fitness: Int = value*dimensions
}

表达式value*dimensions将在创建类的实例时计算,并作为Int值放置在类内存中。当访问fitness成员时,将从类内存中检索并返回该值;它不会被重新计算。

如果fitness是用def而不是val声明的,那么每次访问fitness都会计算表达式。

如果使用var声明fitness,则可以将该值替换为新值,并且任何后续对fitness的访问都将返回新值。

最新更新