Referencias cruzadas de límites de tipo abstracto de Scala

Tengo dos clases abstractas que tendrán referencias entre sí. ¿Cómo puedo vincular los tipos de miembros para que los tipos de HexT en los miembros SideT de las clases hexadecimales derivadas sean siempre la clase hexadecimal derivada? por lo que para una clase derivada HexA se garantiza que: HexA#SideT#HexT = HexA

Y de manera similar, los tipos de SideT en los miembros HexT de todas las clases Side derivadas serán la Clase Side derivada: SideB#HexT#SideT = SideB

Estoy usando Scala para Eclipse 2.1.0.M1 con Eclipse 3.7.2 Todas las clases están en archivos separados. Lo siguiente compila bien pero no garantiza lo que quiero:

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 }

Pero lo siguiente no se compilará en las implementaciones derivadas:

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
}

¿Es esto correcto? ¿Debería compilar esto?

preguntado el 22 de mayo de 12 a las 20:05

1 Respuestas

¿Qué tal esto?

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 rasgo de encapsulación para el 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 parámetros de 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]

contestado el 23 de mayo de 12 a las 06:05

Lo siento, no entiendo las dos soluciones principales. Todavía arrancando mi comprensión de Scala. He visto el combo =:= antes, pero no puedo encontrar una referencia. Curiosamente probé el tercer soln meses atrás en C#. El compilador de C# no lo aceptaría. Si es posible, me gustaría usar tipos abstractos dentro de Hex y Side, aunque usaré genéricos para las colecciones que los contienen. - rico oliver

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.