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

2

あなたが望むものを達成するためには、次の構造変更を行う必要があると思います:

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

そうすれば、パラメータの少ないコンストラクタを問題なく記述できます (たとえば、"positive" を省略します)。不変の値に固執したい場合、Scala でその逆を行うのは困難です。

クラス本体に次の宣言がある場合:

val positive: Boolean = true

positiveもう変更することはできません。それを回避する方法はありません:)

于 2013-05-26T15:41:10.493 に答える
1

1 つのコンストラクターに切り替え、最後に正を追加し、次のようにデフォルト値の true を指定します。

positive:Boolean = true

このように、指定されていない場合はデフォルトで true になります。次に、apply 関数に対して同じことを行い、apply で 3 フィールド コンストラクターを呼び出します。

于 2013-05-26T15:42:08.823 に答える