我一直在努力解决这个恼人的问题,但却找不到优雅的解决方案。
假设我有这样一个类层次结构:
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个子类)!
有没有一种优雅的方法来解决这个混乱的问题?
答案 0 :(得分: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)
...
看多少吵闹多少?长变量名称是样板的一种形式。有时为了清晰起见,你需要它,但通常只是将参数传递给构造函数。