Scala:生成伴随对象

标签 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 伴生对象提供的索引处。但是由于伴随对象从它们继承的特征中获取它们的索引,所以除了它们的名称之外,它们之间没有任何区别。因此,生成它们会很好。

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

最佳答案

我不认为在 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

关于Scala:生成伴随对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13991645/

相关文章:

scala - Scala 的 apply() 方法魔法是如何工作的?

inheritance - Kotlin:类继承了包含伴随对象的接口(interface),但无权访问接口(interface)的常量

scala - 无法在 Intellij IDEA 13 中配置 Scala

java - Play Framework (2.4)、sbt (0.13.17) 的热重载以及整个项目完全重新编译的原因

java - 将 Java 数组转换为 Scala 集合

scala - Akka Actor "ask"和 "Await"带有 TimeoutException

Kotlin - 伴随对象在变量更改时更改其值

scala - 如何将 "instantiate"抽象类放在父类(super class)中?

Scala - 创建扩展密封抽象类的案例对象列表

list - Scala 整数列表列表