Domanda

Ho due classi astratte che tiene referenze l'una all'altra. Come / posso digitare legato i membri del tipo in modo che i tipi di Hext nei membri festeggiamenti delle classi esagonali derivanti saranno sempre la classe esagonale derivata?Quindi per una classe derivata Hexa è garantita che: Hexa # dateca # hext= hexa

E allo stesso modo che i tipi di sidet nei membri hext di tutte le classi laterale derivate saranno la classe laterale derivata: sideb # hext # sidet= sideb

Sto usando Scala per Eclipse 2.1.0.m1 con Eclipse 3.7.2 Tutte le classi sono in file separati.La seguente compila OK ma non garantisce quello che voglio:

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

Ma il seguente non sarà compilato nelle implementazioni derivate:

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

è corretto?Questo dovrebbe compilare?

È stato utile?

Soluzione

Che ne dici di questo?

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

o con un tratto incapsulante per il dominio:

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

o con i parametri del tipo:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top