scala - una - Diferencia entre la clase abstracta y el rasgo
para que sirve una clase abstracta (4)
Al menos en Scala, el sistema de rasgos tiene una forma explícita de declarar prioridad padre en una subclase para evitar problemas típicos asociados con la herencia múltiple, es decir, conflictos con métodos heredados que tienen la misma firma.
Los rasgos son similares a las interfaces de Java, pero se les permite tener implementaciones de métodos.
Posible duplicado:
Rasgos de Scala vs clases abstractas
¿Cuál es la diferencia conceptual entre las clases abstractas y los rasgos?
Conceptualmente, un rasgo es un componente de una clase, no una clase en sí misma. Como tal, normalmente no tiene constructores, y no está destinado a "mantenerse por sí mismo".
Sugiero usar una clase abstracta cuando tiene un significado independiente, y rasgos cuando solo quieres agregar funcionalidad de una manera orientada a objetos. Si no está seguro entre los dos , puede encontrar que si todos sus métodos giran en torno a hacer una sola cosa, es probable que desee un rasgo.
Para un ejemplo (no específico del idioma), si su Empleado debe extender tanto "Persona" como "Clonable", haga de Person una clase base y Cloneable un rasgo.
Un aspecto de los rasgos es que son apilables . Permitir una forma restringida de AOP (alrededor de consejos).
trait A{
def a = 1
}
trait X extends A{
override def a = {
println("X")
super.a
}
}
trait Y extends A{
override def a = {
println("Y")
super.a
}
}
scala> val xy = new AnyRef with X with Y
xy: java.lang.Object with X with Y = $anon$1@6e9b6a
scala> xy.a
Y
X
res0: Int = 1
scala> val yx = new AnyRef with Y with X
yx: java.lang.Object with Y with X = $anon$1@188c838
scala> yx.a
X
Y
res1: Int = 1
La resolución de super
refleja la linealización de la jerarquía de herencia.
Una clase solo puede extender una superclase , y por lo tanto, solo una clase abstracta. Si quiere componer varias clases, la forma de Scala es usar la composición de la clase mixin : combina una superclase (opcional), sus propias definiciones de miembro y uno o más traits . Un rasgo está restringido en comparación con las clases en que no puede tener parámetros de constructor (compare el manual de referencia de scala ).
Las restricciones de los rasgos en comparación con las clases se introducen para evitar problemas típicos con la herencia múltiple. Hay reglas más o menos complicadas con respecto a la jerarquía de herencia; podría ser mejor evitar una jerarquía donde esto realmente importa. ;-) Por lo que yo entiendo, solo puede importar si heredas dos métodos con la misma firma / dos variables con el mismo nombre de dos rasgos diferentes.