我只是想知道使用特征来构建游戏对象在语义上是否正确。一方面,我将其视为具有关系(对象具有组件),但另一方面,我将组件视为组成对象。
例如。你有一个游戏对象。一个游戏对象本身几乎什么都不做,但是你混入其中的东西会给它额外的属性。组件可以是 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/