Pergunta

Alguém pode explicar características em Scala? Quais são as vantagens de traços de mais de estender uma classe abstrata?

Foi útil?

Solução

A resposta curta é que você pode usar vários traços - elas são "empilháveis". Além disso, características não podem ter parâmetros do construtor.

Veja como traços são empilhados. Note que a ordem dos traços são importantes. Eles vão chamar uns aos outros da direita para a esquerda.

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
  }
}

Outras dicas

Este local dá um bom exemplo de uso característica. Uma grande vantagem das características é que você pode estender características múltiplas, mas apenas uma classe abstrata. Traços resolver muitos dos problemas com herança múltipla, mas permitir a reutilização de código.

Se você sabe rubi, características são semelhantes para misturar-ins

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!
)

Este é o melhor exemplo que eu vi

Scala na prática: Compor Traços - estilo Lego: http: //gleichmann.wordpress. COM / 2009/10/21 / scala-in-prática traços compondo--lego-style /

    class Shuttle extends Spacecraft with ControlCabin with PulseEngine{

        val maxPulse = 10

        def increaseSpeed = speedUp
    }

Traços são úteis para a mistura de funcionalidade para uma classe. Dê uma olhada na http://scalatest.org/ . Observe como você pode misturar em várias linguagens específicas de domínio (DSL) em uma classe de teste. olhada no guia de início rápido para olhada em alguns do DSL é suportado por ScalaTest ( http://scalatest.org/quick_start)

Assim como interfaces em Java, os traços são usados ??para definir os tipos de objetos, especificando a assinatura dos métodos suportados.

Ao contrário de Java, Scala permite traços de ser parcialmente implementado; ou seja, é possível definir implementações padrão para alguns métodos.

Em contraste com as classes, os traços podem não ter parâmetros do construtor. Traços são como classes, mas que define uma interface de funções e campos que as classes podem fornecer valores e implementações concretas.

Traços pode herdar de outros traços ou de classes.

Estou citando a partir do site do livro Programação em Scala, Primeira Edição e mais especificamente a seção chamada " para traço, ou não traço? " do Capítulo 12.

Sempre que você implementar um conjunto reutilizável de comportamento, você terá que decidir se você quer usar um traço ou uma classe abstrata. Não existe uma regra firme, mas esta seção contém algumas orientações a considerar.

Se o comportamento não pode ser reutilizado, em seguida, torná-lo uma classe concreta. Não é o comportamento reutilizável depois de tudo.

Se ele pode ser reutilizado em múltiplas, as classes não relacionadas, torná-lo um traço. Somente traços podem ser misturados em diferentes partes da hierarquia de classe.

Há um pouco mais informações no link acima a respeito de traços e eu sugiro que você leia a seção completa. Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top