문제

나는 서로의 참조를 보유 할 두 개의 추상적 인 클래스를 가지고있다. 파생 된 육각 클래스의 선두 회원의 헥타리의 유형이 항상 파생 된 육각 클래스가 될 것이라는 일이므로 타입 구성원을 바인딩 할 수있게 할 수 있으므로?따라서 파생 된 클래스 헥사에서는 다음과 같이 보장됩니다 : Hexa # sidet # hext= hexa

및 유사하게 모든 파생 된 사이드 클래스의 헥타르의 일종이 파생 된 사이드 클래스가 될 것입니다 : Sideb # hext # sidet= sideb

Eclipse 2.1.0.m1의 SCALA를 사용하고 있습니다. 3.7.2 모든 클래스는 별도의 파일에 있습니다.다음은 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
}
.

이게 정확합니까?이 컴파일해야합니까?

도움이 되었습니까?

해결책

어때?

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]
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top