質問
私は互いに参照を保持する2つの抽象クラスを持っています。そのため、派生クラスのHEXAの場合、それが保証されています:hexa#sidet#hext= hexa
そして、すべての派生サイドクラスのHEXTメンバー内のSIDETの種類は派生側クラスになるでしょう:sideb#hext#sidet= sideb
Eclipse 2.1.0.m1のためにScalaを使用していますeclipse 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]
. 所属していません StackOverflow