2010-12-04 23 views
37

Quiero hacer lo siguiente, pero la línea de auto-tipo simplemente no compila. ¿Tengo esta sintaxis incorrecta o esto es simplemente imposible?¿Son posibles múltiples auto tipos?

trait A { 
    def aValue = 1 
} 
trait B { 
    def bValue = 1 
} 
trait C { 
    a : A, b : B => 
    def total = a.aValue + b.bValue 
} 

class T extends C with A with B { ... 

Respuesta

65

Puede tener un solo tipo de auto que sea de tipo compuesto.

Prueba esto:

trait A { 
    def aValue = 1 
} 
trait B { 
    def bValue = 1 
} 
trait C { 
    self: A with B => 
    def total = aValue + bValue 
} 

class ABC extends A with B with C 
2

Con un rasgo puede hacerlo con tipo estructural:

trait C { 
    self: { def aValue: Int 
      def bValue: Int } => 

    def total = aValue + bValue 
} 

class ABC extends C { 
    def aValue = 1 
    def bValue = 1 
} 

de reflexión utilizada.

Pero, en primer lugar, no debe abusar de los tipos propios debido a principle of least power.

Métodos de la pregunta se pueden añadir simplemente mediante la extensión de otro tait:

trait C extends A with B{ 
    def total = aValue + bValue 
} 

o escriba ambos métodos explícitamente:

trait C { 
    def aValue: Int 
    def bValue: Int 

    def total = aValue + bValue 
} 

Dónde utilizar la auto-tipos?

Los tipos propios se suelen utilizar con las clases. Esta es una buena forma para que el rasgo requiera ser una subclase de una clase deseada.

También hay un buen uso de self-type con triats: cuando se quiere manipular el orden de inicialización de clase con multi-herencia.

Cuestiones relacionadas