2

私はこの厄介な問題に、エレガントな解決策を見つけることなくしばらく苦労してきました。

私がそのようなクラス階層を持っているとしましょう:

class StatWithBounds[A](val min: A, val max: A, val currentValue: A)
class StatBetween0And20(initialValue: Int) extends StatWithBounds[Int](0, 20, initialValue)
class PositiveStatOnly(initialValue: Int) extends StatWithBounds[Int](0, Integer.MAX_VALUE, initialValue)
class UncappedPercentage(initialValue: Int) extends StatWithBounds[Int](0, Integer.MAX_VALUE, initialValue)

initialValueのコピー/貼り付けは非常に冗長です。さらに、私がこのようなことをしたい場合:

class Strength(initialValue: Int) extends StatBetween0And20(initialValue)
class Intelligence(initialValue: Int) extends StatBetween0And20(initialValue)
class Piety(initialValue: Int) extends StatBetween0And20(initialValue)

なんとコピー/貼り付けの地獄(そして私がさらに10個のサブクラスを持っていると想像してください)!

この雑然とした問題を解決するためのエレガントな方法はありますか?

4

1 に答える 1

5

元のクラスが必要ない場合は、代わりにトレイトを使用できます。

trait StatWithBounds[A] {
  def min: A
  def max: A
  def currentValue: A
}

trait StatBetween0And20 extends StatWithBounds[Int] {
  def min = 0
  def max = 20
}

class Strength(val currentValue: Int) extends StatBetween0And20
class Intelligence(val currentValue: Int) extends StatBetween0And20
...

あるいは、そのような長い変数名を使用することはできません。

class Stat[A](val min: A, val max: A, val current: A)
class Stat20(i: Int) extends Stat[Int](0, 20, i)
class Strength(i: Int) extends Stat20(i)
class Intelligence(i: Int) extends Stat20(i)
...

ノイズがどれだけ少ないかわかりますか?長い変数名は定型文の形式です。明確にするために必要な場合もありますが、通常は、コンストラクターに引数を渡すためだけではありません。

于 2012-12-21T11:52:41.377 に答える