3

无论如何,是否可以为某个类的每个子类自动生成一个伴随对象?

例如,我有class Component[T]一个val companion: CompType[T]whereT应该是子类。例如:class Transform extends Component[Transform]

有什么办法可以为每个子类生成伴随对象 - 虽然看起来很琐碎 - 以节省为我制作的每种组件输入对象定义?

编辑:

所有这一切的最终目标是一个实体系统。每个伴生对象都有一个唯一的整数(它从继承的特征中获取),可用于从组件数组中查找该特定类型的组件。例如,如果我想向实体添加一个 Transform 组件,我会调用:

addComponent(entity, Transform, new Transform(params))

然后,新Transform对象将被放置在表示由 Transform 伴随对象提供的索引处的实体的组件数组中。但是由于伴生对象从它们继承的特征中获取索引,因此除了它们的名称之外,它们之间没有任何类型的差异。因此,为什么生成它们会很好。

很抱歉一开始就没有更具体。如果这仍然令人困惑,那很可能是我只是以完全错误的方式做这件事!如果您这么认为,请随时告诉我。

4

2 回答 2

4

我认为目前没有任何方法可以在 Scala 中自动生成伴随对象。即将推出的宏类型支持最终可能会对您有所帮助,但这仍在开发中。

如果我理解正确,伴生对象的存在只是为了提供每个类的唯一整数?在这种情况下,也许这样的事情会起作用?

scala> object UniqueNumberProvider {
     |   val numbers = new collection.mutable.HashMap[Class[_], Int]
     |   def numberForClass(clazz: Class[_]) = numbers.get(clazz) match {
     |     case Some(n) => n
     |     case None => numbers.update(clazz, numbers.size + 1); numbers.size
     |   }
     | }
defined module UniqueNumberProvider

scala> UniqueNumberProvider.numberForClass(classOf[String])
res7: Int = 1

scala> UniqueNumberProvider.numberForClass(classOf[String])
res8: Int = 1

scala> UniqueNumberProvider.numberForClass(classOf[Int])
res9: Int = 2
于 2012-12-21T16:15:20.513 回答
-1

您可以使用 Scala 2.10 中的宏来完成。您可以在http://docs.scala-lang.org/overviews/macros/overview.html查找用法

于 2012-12-21T16:15:59.770 回答