Referencias cruzadas de límites de tipo abstracto de Scala
Frecuentes
Visto 218 veces
2
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?
1 Respuestas
1
¿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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas scala type-bounds or haz tu propia pregunta.
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