scala - 在Scala中可以使用traits来构建游戏组件系统吗?

标签 scala traits

我只是想知道使用特征来构建游戏对象在语义上是否正确。一方面,我将其视为具有关系(对象具有组件),但另一方面,我将组件视为组成对象。

例如。你有一个游戏对象。一个游戏对象本身几乎什么都不做,但是你混入其中的东西会给它额外的属性。组件可以是 HealthComponent(有健康)、PhysicsComponent(模拟物理)、ClickableComponent(可以点击)。

我喜欢使用特征的想法,因为所有的属性和方法都添加到原始对象上,我可以做到 player.getHP而不是 player.getHealthComponent.getHP .另一方面,我发现使用 trait 的命名和语义很奇怪。 trait HealthComponent extends GameObject - 这没有意义。一个 HealthComponent属于游戏对象,它不满足 extend 暗示的关系.假设特征通常被视为其父类的专门版本,我是否正确?如果是这样,我将如何命名类似上述对象的名称?

最佳答案

补充@Moritz's answer ,也可以在不从父类(super class)型继承实现的情况下堆叠相关行为:

trait HasFoo { def foo: Unit }

class GameObject extends HasFoo {
   def foo = {}
}

trait Health extends HasFoo { 
   self: GameObject =>

   abstract override def foo = {
      println("health foo")
      super.foo
   }
}

trait Dog extends HasFoo { 
   self: GameObject =>

   abstract override def foo = {
      println("dog foo")
      super.foo
   }
}

scala> val g = new GameObject with Health with Dog
g: GameObject with Health with Dog = $anon$1@33b7b32c

scala> g.foo
dog foo
health foo

关于scala - 在Scala中可以使用traits来构建游戏组件系统吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5574480/

相关文章:

scala - Spark-scala 数据帧中的时间戳比较

scala - Scala 中的正则表达式和模式匹配第二部分

scala - Scala 中的大小参数化

scala - 使用Traits的Scala客户端组合与实现抽象类

generics - 通用特征和生命周期的问题

c++ - 什么样的C++模板编程可以调用 "meta programming"?

c++ - 指定具有特征的模板化类

java - Akka/Java getContext().become 带参数?

postgresql - Slick and bonecp : org. postgresql.util.PSQLException : FATAL: sorry, 太多客户端已经错误

struct - 有没有更好的方法将此行为组织为特征集合?