Question

J'ai deux classes abstraites qui tiendront des références à l'autre.Comment / puis-je taper liée aux membres du type afin que les types de heext dans les membres SIDET des classes hexagères dérivés seront toujours la classe hexagonale dérivée?Donc, pour un hexa de classe dérivé, il est garanti que: hexa # sidet # heext= hexa

Et de même que les types de Sidet dans les membres HEXT de toutes les classes latérales dérivées seront la classe latérale dérivée: Sideb # heext # Sidet= Sideb

J'utilise SCALA pour Eclipse 2.1.0.m1 avec Eclipse 3.7.2 Toutes les classes sont dans des fichiers distincts.Ce qui suit compile OK mais ne garantit pas ce que je veux:

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 }

Mais ce qui suit ne compilera pas dans les implémentations dérivées:

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
}

est-ce correct?Devrait-il compiler?

Était-ce utile?

La solution

Du de quoi ça se passe?

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]

ou avec un trait d'encapsulation pour le domaine:

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
}

ou avec des paramètres de type:

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]

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top