2

相互参照を保持する 2 つの抽象クラスがあります。派生 Hex クラスの SideT メンバーの HexT の型が常に派生 Hex クラスになるように、型メンバーを型バインドするにはどうすればよいですか? したがって、派生クラス HexA の場合、HexA#SideT#HexT = HexA が保証されます。

同様に、すべての派生サイド クラスの HexT メンバーの SideT の型は、派生サイド クラスになります。 SideB#HexT#SideT = SideB

私はEclipse 3.7.2でEclipse 2.1.0.M1にScalaを使用しています。すべてのクラスは別のファイルにあります。以下は正常にコンパイルされますが、私が望むものを保証しません:

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
}

これは正しいです?これはコンパイルする必要がありますか?

4

1 に答える 1

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]
于 2012-05-23T05:20:03.500 に答える