2012-05-22 3 views
2

서로에 대한 참조를 보유 할 두 개의 추상 클래스가 있습니다. 형식 멤버를 바인딩하는 방법은 파생 된 16 진수 클래스의 SideT 멤버의 HexT 유형이 항상 파생 된 Hex 클래스? 파생 클래스 HexA의 경우 HexA # SideT # HexT = HexA스칼라 추상 형식 경계 상호 참조

마찬가지로 파생 된 모든 Side 클래스의 HexT 멤버의 SideT 유형은 파생 Side Class가됩니다. SideB # HexT # SideT = SideB

Eclipse 3.7.2에서 Eclipse 2.1.0.M1 용 스칼라를 사용하고 있습니다. 모든 클래스는 별도의 파일에 있습니다. 다음은 OK 컴파일하지만, 내가 원하는 보장하지 않습니다

abstract class Hex { type SideT <: Side {type HexT <= Hex } } 
abstract class Side { type HexT <: Hex {type SideT <= side } } 
class HexC() extends Hex() { type SideT = SideC } 
class SideC extends Side { type HexT = HexC } 

그러나 다음은 파생 구현에 컴파일되지 않습니다 :

abstract class Hex{type SideT <: Side {type HexT = this.type}} 
abstract class Side{type HexT <: Hex {type SideT = this.type}} 
class HexC() extends Hex(){ 
    type SideT = SideC //This won't compile 
} 
class SideC extends Side { 
    type HexT = HexC //this won't compile 
} 

이 맞습니까? 이 컴파일해야합니까?

답변

1

어때?

abstract class Hex { 
    type SideT <: Side 
} 

abstract class Side { 
    type HexT <: Hex 
} 

class HexC extends Hex { 
    type SideT = SideC 
} 

class SideC extends Side { 
    type HexT = HexC 
} 

val evidence1 = implicitly[SideC#HexT =:= HexC] 
val evidence2 = implicitly[SideC#HexT#SideT =:= SideC] 

또는 도메인에 대한 캡슐화 특성과

:

trait abstractDomain { 
    type SideT <: Side 
    type HexT <: Hex 

    abstract class Hex 
    abstract class Side 
} 

object domain extends abstractDomain { 
    type SideT = SideC 
    type HexT = HexC 

    class HexC extends Hex 
    class SideC extends Side 
} 

또는와 유형 매개 변수 :

abstract class Hex[HexT <: Hex[HexT, SideT], SideT <: Side[HexT, SideT]] 
abstract class Side[HexT <: Hex[HexT, SideT], SideT <: Side[HexT, SideT]] 

class HexC extends Hex[HexC, SideC] 
class SideC extends Side[HexC, SideC] 
+0

미안 상단이 솔루션을 이해하지 않습니다. 스칼라 이해를 여전히 부트 스트랩합니다. 나는 = : = 콤보를 보았지만 그것을 참조 할 수는 없습니다. Funnily 나는 C#으로 3 번째 달을 다시 보았습니다. C# 컴파일러는이를 받아 들일 수 없습니다. 가능하다면, Hex와 Side 내에서 추상적 인 타입을 사용하고 싶습니다. 비록 그것을 포함하고있는 콜렉션에 제네릭을 사용할 것입니다. –