无论如何都要为某个类的每个子类自动生成一个伴随对象吗?
例如,我有一个class Component[T]
,其中val companion: CompType[T]
应该是T
的子类。例如:class Transform extends Component[Transform]
。
是否有任何方法可以生成每个子类的伴随对象 - 虽然看起来很小 - 保存为我制作的每种组件输入对象定义?
修改
所有这一切的最终目标是实体系统。每个伴随对象都有一个唯一的整数(它来自一个继承的特征),可以用来从一个组件数组中查找该特定类型的组件。例如,如果我想将一个Transform组件添加到实体,我会调用:
addComponent(entity, Transform, new Transform(params))
然后,新的Transform
对象将被放置在表示Transform伴随对象提供的索引处的实体的组件数组中。但是,由于伴侣对象从他们继承的特征中得到它们的索引,因此除了它们的名称之外,它们之间没有任何类型的区别。因此,为什么生成它们会很好。
很抱歉没有更具体的开头。如果这仍然令人困惑,很可能我只是以完全错误的方式做到这一点!如果您愿意,请随时告诉我。
答案 0 :(得分: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
答案 1 :(得分:-1)
您可以在Scala 2.10中使用宏来执行此操作。 您可以在http://docs.scala-lang.org/overviews/macros/overview.html
查找用法