Scala:生成伴随对象

时间:2012-12-21 14:08:25

标签: scala companion-object

无论如何都要为某个类的每个子类自动生成一个伴随对象吗?

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

是否有任何方法可以生成每个子类的伴随对象 - 虽然看起来很小 - 保存为我制作的每种组件输入对象定义?

修改

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

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

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

很抱歉没有更具体的开头。如果这仍然令人困惑,很可能我只是以完全错误的方式做到这一点!如果您愿意,请随时告诉我。

2 个答案:

答案 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

查找用法