Parece que el uso más común de explicitly-typed self references de Scala se encuentra en el "Cake pattern", en el que las dependencias de un módulo se declaran como:Utilidad de referencias auto escritas explícitamente en el modelo de la torta
class Foo { this: A with B with C =>
// ...
}
En general, ignorando el modelo de la torta por un momento, A
, B
y C
puede referirse a cualquier cosa de nivel de tipo, tal como un parámetro de tipo:
class Outer[A, B, C] {
class Inner { this: A with B with C =>
// ...
}
}
... o un miembro de tipo abstracto:
class Outer {
type A
type B
type C
class Inner { this: A with B with C =>
// ...
}
}
En ninguno de estos casos podríamos haber escrito abstract class Inner extends A with B with C
, porque A
, B
y C
no son conocidos por ser los rasgos. Las auto referencias explícitamente tipadas son necesarias aquí. Sin embargo, sólo he visto el patrón de la torta hecha con rasgos:
trait A { def a }
trait B { def b }
trait C { def c }
class Foo { this: A with B with C =>
// ...
}
En este caso, en vez podemos escribir directamente abstract class Foo extends A with B with C
, que si no me equivoco tiene el mismo significado. ¿Estoy en lo correcto? Si no, ¿cómo difieren? y si es así, ¿por qué parece que todos usan la auto referencia explícitamente tipada?
posible duplicado de [¿Cuál es la diferencia entre Scala auto-tipos y subclases de rasgos?] (Http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self -types-and -it-subclasses) – sschaef
@sschaef diferente pregunta allí, pero uno de los comentarios de Daniel en su respuesta podría ser la respuesta que estoy buscando ... Parece ser similar a la herencia 'pública' vs.' protegida 'herencia en C++? – mergeconflict
Para mí, ambas preguntas parecen querer saber lo mismo: difieren en clases abstractas frente a rasgos que tienen la misma dirección. ¿O entendí fundamentalmente algo mal? – sschaef