加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 不可变类层次结构中的多态更新

发布时间:2020-12-16 09:34:46 所属栏目:安全 来源:网络整理
导读:根据具体类可能具有的各种属性,我希望能够从特征中收集域对象。当我的对象是可变的,这是非常简单的。例如: trait HasHitPoints { var hitPoints: Int = 100 }trait HasBearing { var bearing: Double = 0 }class Ship extends HasHitPoints with HasBeari
根据具体类可能具有的各种属性,我希望能够从特征中收集域对象。当我的对象是可变的,这是非常简单的。例如:

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

此外,如果我知道确切的类型,我可以轻松地修改具体类使用副本。例如,很难的部分是更新任意的HasHitPoints。如果我有很多具体的课程,还有很多不同的属性,我可能喜欢混合,什么是最好的方案,以避免爆炸的样板代码?

解决方法

你可能会有一些运气,添加一个例如抽象def与您的traits的HitPoints(points:Int)方法,它返回具有不同属性值的容器对象的副本。这样可以减少使用情况:

val damagedActors = actors map { actor => actor.withHitPoints( actor.hitPoints - 10 ) }

但是,否则将需要每个具体类的每个属性额外的方法,所以我不知道它真的解决了你的问题。对于像Scala这样的静态语言来说,这并不适合(也不会对这种特殊用途的不变性感到困扰);这里的一个不可替代的解决方案可能是动态语言的更好的候选者。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读