Las tres formas son válidas, y tienen el efecto de que B
se asume como el tipo de this
en la clase A
.
Las primeras dos variantes
trait A { self: B => ... }
trait A { foo: B => ... }
introducen self
(respectivamente, foo
) como un alias para this
en rasgo A
. Esto es útil para acceder a la referencia this
de una clase interna. Es decir. luego puede usar self
en lugar de A.this
al acceder a la referencia this
del rasgo A
de una clase anidada dentro de él. Ejemplo:
class MyFrame extends JFrame { frame =>
getContentPane().add(new JButton("Hide") {
addActionListener(new ActionListener {
def actionPerformed(e: ActionEvent) {
// this.setVisible(false) --> shadowed by JButton!
frame.setVisible(false)
}
})
})
}
La tercera variante,
trait A { this: B => ... }
no introduce un alias para this
; simplemente establece el tipo de uno mismo.
La forma en que veo el tipo de autoestima es que el rasgo se declaró tomando cierto tipo y devolviendo el bloque de código, p. foo: B => {...}. Ahora esos curlies son, por supuesto, omitidos. Es interesante ver que puedes usar el nombre del objeto en lugar de "esto" dentro de cualquier ámbito del código aunque [algo que hacemos todo el tiempo en javascript] –
@Martin Odersky ¿Es posible agregar restricciones para dos o más rasgos, algo así como 'rasgo A {self: B, C => ...}'? –
@DmitryBespalov: Sí, puede usar la palabra clave 'with' en la anotación de auto-tipado. Por ejemplo 'rasgo A {self: B con C => ...}' – Dave