ventajas usar una sirve resueltos que para interfaces importancia ejercicios ejemplo desventajas cual creacion clases clase abstractas abstracta scala traits

scala - una - ¿Cuáles son las ventajas de usar rasgos sobre clases abstractas?



para que sirve una clase abstracta (7)

Cito del sitio web del libro Programming in Scala, First Edition y más específicamente, la sección llamada " To rasit or not to trait? " Del Capítulo 12.

Cada vez que implemente una colección de comportamiento reutilizable, deberá decidir si desea usar un rasgo o una clase abstracta. No existe una regla firme, pero esta sección contiene algunas pautas a considerar.

Si el comportamiento no se reutilizará, conviértalo en una clase concreta. No es un comportamiento reutilizable después de todo.

Si se puede reutilizar en múltiples clases no relacionadas, conviértalo en un rasgo. Solo los rasgos se pueden mezclar en diferentes partes de la jerarquía de clases.

Hay un poco más de información en el enlace anterior con respecto a los rasgos y le sugiero que lea la sección completa. Espero que esto ayude.

¿Alguien puede explicar los rasgos en Scala? ¿Cuáles son las ventajas de los rasgos sobre la extensión de una clase abstracta?


De forma similar a las interfaces en Java, los rasgos se utilizan para definir tipos de objetos al especificar la firma de los métodos admitidos.

A diferencia de Java, Scala permite que los rasgos se implementen parcialmente; es decir, es posible definir implementaciones predeterminadas para algunos métodos.

A diferencia de las clases, los rasgos pueden no tener parámetros de constructor. Los rasgos son como las clases, pero que definen una interfaz de funciones y campos que las clases pueden proporcionar valores concretos e implementaciones.

Los rasgos pueden heredar de otros rasgos o de las clases.


Este site ofrece un buen ejemplo de uso de rasgo. Una gran ventaja de los rasgos es que puedes extender rasgos múltiples pero solo una clase abstracta. Los rasgos resuelven muchos de los problemas con la herencia múltiple pero permiten la reutilización del código.

Si conoces el rubí, los rasgos son similares a los mix-ins



La respuesta corta es que puede usar múltiples rasgos: son "apilables". Además, los rasgos no pueden tener parámetros de constructor.

Así es cómo se apilan los rasgos. Tenga en cuenta que el orden de los rasgos es importante. Se llamarán entre sí de derecha a izquierda.

class Ball { def properties(): List[String] = List() override def toString() = "It''s a" + properties.mkString(" ", ", ", " ") + "ball" } trait Red extends Ball { override def properties() = super.properties ::: List("red") } trait Shiny extends Ball { override def properties() = super.properties ::: List("shiny") } object Balls { def main(args: Array[String]) { val myBall = new Ball with Shiny with Red println(myBall) // It''s a shiny, red ball } }


Los rasgos son útiles para mezclar funcionalidad en una clase. Eche un vistazo a http://scalatest.org/ . Tenga en cuenta cómo puede mezclar varios lenguajes específicos de dominio (DSL) en una clase de prueba. mira la guía de inicio rápido para ver algunos de los DSL compatibles con Scalatest ( http://scalatest.org/quick_start )


package ground.learning.scala.traits /** * Created by Mohan on 31/08/2014. * * Stacks are layered one top of another, when moving from Left -> Right, * Right most will be at the top layer, and receives method call. */ object TraitMain { def main(args: Array[String]) { val strangers: List[NoEmotion] = List( new Stranger("Ray") with NoEmotion, new Stranger("Ray") with Bad, new Stranger("Ray") with Good, new Stranger("Ray") with Good with Bad, new Stranger("Ray") with Bad with Good) println(strangers.map(_.hi + "/n")) } } trait NoEmotion { def value: String def hi = "I am " + value } trait Good extends NoEmotion { override def hi = "I am " + value + ", It is a beautiful day!" } trait Bad extends NoEmotion { override def hi = "I am " + value + ", It is a bad day!" } case class Stranger(value: String) { }

Output : List(I am Ray , I am Ray, It is a bad day! , I am Ray, It is a beautiful day! , I am Ray, It is a bad day! , I am Ray, It is a beautiful day! )