3

特定のクラスのすべてのサブクラスのコンパニオン オブジェクトを自動的に生成する方法はありますか?

たとえば、サブクラスであるべき場所class Component[T]を持つ があります。例: .val companion: CompType[T]Tclass 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 に答える