5

我有以下代表一些钱的类:

class Money(initDollars: Int, initCents: Int){

  require (initDollars >= 0 && initCents >= 0)

  private def this(positive: Boolean, initDollars: Int, initCents: Int) = {
    this(initDollars, initCents)
    //this.positive = positive
  }

  val positive: Boolean = true
  val dollars = initDollars + initCents/100
  val cents = initCents % 100
  private val totalAmount = dollars * 100 + cents

  def unary_- = new Money(!positive, dollars, cents)
}

object Money{
  def apply(initDollars: Int, initCents: Int) = new Money(initDollars, initCents)
}

金额也可以是负数,我想像这样创建它:

val am = -Money(1, 20)

所以我想val positive从一个辅助构造函数初始化,但我不能这样做,因为它是重新分配给 val。我也无法将val参数列表添加到辅助构造函数。有人可以帮忙吗?

4

3 回答 3

8

反过来做。

class Money private (pos: Boolean, initDollars: Int, initCents: Int) {

  require (initDollars >= 0 && initCents >= 0)

  def this(initDollars: Int, initCents: Int) = {
    this(true, initDollars, initCents)
  }

  val positive: Boolean = pos
  val dollars = initDollars + initCents/100
  val cents = initCents % 100
  private val totalAmount = dollars * 100 + cents

  def unary_- = new Money(!positive, dollars, cents)
}
于 2013-05-26T15:39:16.847 回答
2

我认为为了达到你想要的,你必须做以下结构修改:

class Money(initDollars: Int, initCents: Int, positive: Boolean)

这样,您就可以编写一个具有较少参数的构造函数而不会出现问题(例如,省略“正数”)。如果您想坚持不可变的值,那么在 Scala 中反之则很难。

如果您的班级主体中有以下声明:

val positive: Boolean = true

你将无法再改变positive,无法绕过它:)

于 2013-05-26T15:41:10.493 回答
1

切换到一个构造函数,在末尾添加正数并给它一个默认值 true ,如下所示:

positive:Boolean = true

这种方式如果没有提供,则默认为 true。然后对你的 apply 函数执行相同的操作,并在 apply 中调用 3 字段构造函数。

于 2013-05-26T15:42:08.823 回答