Pergunta

Eu tenho duas classes abstratas que manterão referências uma à outra. Como/posso digitar os membros do tipo de forma que os tipos de HexT nos membros SideT das classes Hex derivadas sempre sejam a classe Hex derivada?então para uma classe derivada HexA é garantido que:HexA#LadoT#HexT = HexA

E da mesma forma que os tipos de SideT nos membros HexT de todas as classes Side derivadas serão a classe Side derivada:LadoB#HexT#LadoT = LadoB

Estou usando Scala para Eclipse 2.1.0.M1 com Eclipse 3.7.2. Todas as classes estão em arquivos separados.O seguinte compila OK, mas não garante o que eu quero:

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 }

Mas o seguinte não será compilado nas implementações 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
}

Isso está correto?Isso deve ser compilado?

Foi útil?

Solução

Que tal agora?

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 com uma característica de encapsulamento para o domínio:

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 com 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]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top