2012-12-21 4 views
3

특정 클래스의 모든 하위 클래스에 대한 컴패니언 개체를 자동으로 생성 할 수 있습니까?스칼라 : 도우미 객체 생성

예를 들어, val companion: CompType[T]class Component[T]입니다. 여기서 T은 서브 클래스 여야합니다. 예 : class Transform extends Component[Transform].

있는 방법은 동반자가 생성 될 각 서브 클래스에 대한 객체를 가지고 모두가 - 그것은 보이지만 사소한 - 저장 내가 할 구성 요소의 모든 종류의 개체 정의를 입력?

편집 :

모든이의 최종 목표는 기업 시스템이다. 각 컴패니언 개체는 구성 요소 배열에서 해당 특정 형식의 구성 요소를 조회하는 데 사용할 수있는 고유 한 정수 (상속 된 특성에서 가져 오는 고유 한 정수)를가집니다. 나는 엔티티로 변환 컴포넌트 추가 할 경우에 따라서 예를 들어, 내가 부를 것이다 :

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

새로운 Transform 객체가 다음에서 제공하는 인덱스의 개체를 나타내는 구성 요소의 배열에 배치 될 것 변환 동반자 개체. 그러나 동반자 물체가 상속받은 형질로부터 그들의 색인을 얻었으므로, 그들의 이름과 별개로 어떤 것의 형식화 된 차이점은 없습니다. 그러므로 왜 그들이 생성되도록하는 것이 좋을까요?

로 시작하는보다 구체적인없는 죄송합니다. 이것이 여전히 혼란 스럽다면, 나는 이것이 완전히 잘못된 길일뿐입니다. 그렇게 생각한다면 자유롭게 말해주세요.

+0

에서 사용 찾을 수 있습니까? 당신은 그들을 위해 무엇을 필요로합니까? –

+0

미안 나는 그것을 정말로 언급해야했다. 나는 그 질문을 비교적 짧게하고 싶었다. 자세한 내용을 편집하고 추가하겠습니다. – Mistodon

답변

3

나는 자동으로 현재의 약자로 동반자 스칼라에서 객체를 생성 할 수있는 방법이 있다고 생각하지 않습니다. 다가오는 매크로 유형 지원이 결국에는 도움이 될 수 있지만 아직 개발 중입니다. 내가 제대로 이해하면

는 동반자 객체는 클래스마다 고유 한 정수를 제공하기 위해 존재? 어떤 경우에, 아마도 이와 같은 것이 효과가 있을까요?

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 
+0

Yeap, 나는 똑같은 것을 제안하려고했다. Upvoted. – wleao

+0

numberForClass를 호출하면서 경쟁 조건을 가질 수 있습니다. 내가 잘못? – wleao

+0

그래 - 그것은 약자로 코드가 스레드하지 않습니다 (나를 위해이 함께 –

-1

Scala 2.10의 매크로를 사용하여 수행 할 수 있습니다. 이러한 동반자 개체는 무엇을 포함됩니다 http://docs.scala-lang.org/overviews/macros/overview.html

+1

현재 매크로가있는 매크로 (예 : def 매크로)를 사용하여이를 수행하는 방법을 잘 모르겠습니다. 비록 내가 틀린 것으로 입증 된 것을 기뻐할지라도. –

+4

예를 들어 주시겠습니까? 스칼라 2.10에는 없으며 아직 완벽하게 설계되지 않은 매크로 유형이 필요하다는 것을 확신합니다. –