Polymorphic updates in an immutable class hierarchy

后端 未结 3 813
再見小時候
再見小時候 2021-01-01 15:23

I\'d like to be able to assemble domain objects from traits, according to various properties that the concrete classes might have. When my objects are mutable, this is prett

3条回答
  •  失恋的感觉
    2021-01-01 15:30

    Sorry for the necromancy, but it is worth pointing that this is doable using F-bounded polymorphism:

      trait HasHitPoints[Self <: HasHitPoints[Self]] { 
        val hitPoints: Int 
        def updateHitpoints(f: Self => Int): Self
      }
      trait HasBearing { val bearing: Double }
    
      case class Ship(hitPoints: Int, bearing: Double)
          extends HasHitPoints[Ship]
          with HasBearing {
        override def updateHitpoints(f: Ship => Int): Ship = copy(hitPoints = f(this))
      }
      case class Base(hitPoints: Int) extends HasHitPoints[Base] {
        override def updateHitpoints(f: Base => Int): Base = copy(hitPoints = f(this))
      }
    
      val things = Ship(50, 0) :: Base(100) :: Nil
    
      val heal = things.map(_.updateHitpoints(_.hitPoints + 10))
    
      val totalHitPoints = heal.map(_.hitPoints).sum
    

提交回复
热议问题