【发布时间】:2012-01-10 10:31:57
【问题描述】:
我希望能够根据具体类可能具有的各种属性从特征组装域对象。当我的对象是可变的时,这非常简单。例如:
trait HasHitPoints { var hitPoints: Int = 100 }
trait HasBearing { var bearing: Double = 0 }
class Ship extends HasHitPoints with HasBearing
class Base extends HasHitPoints
val entities = new Ship :: new Base :: Nil
entities.collect { case h: HasHitPoints => h.hitPoints += 10 }
特别是,我可以在不知道具体类型的情况下多态地读取或更新任何HasHitPoints 实例。
用不可变对象实现这一点的最佳方法是什么?如果我很高兴只阅读属性,那么我可以执行以下操作:
trait HasHitPoints { val hitPoints: Int }
trait HasBearing { val bearing: Double }
case class Ship(hitPoints: Int, bearing: Double) extends HasHitPoints with HasBearing
case class Base(hitPoints: Int) extends HasHitPoints
val things = Ship(50, 0) :: Base(100) :: Nil
val totalHitPoints = things.collect { case h: HasHitPoints => h.hitPoints }.sum
另外,如果我知道确切的类型,我可以使用copy 轻松修改具体类。例如,困难的部分是更新任意HasHitPoints。如果我有很多具体的类,以及我可能想要混合的很多不同的属性,那么避免样板代码爆炸的最佳方案是什么?
【问题讨论】:
标签: scala inheritance immutability