Frage

Kann jemand bitte Züge in Scala erklären? Was sind die Vorteile der Züge über eine abstrakte Klasse erweitern?

War es hilfreich?

Lösung

Die kurze Antwort ist, dass Sie mehrere Züge nutzen können - sie sind „stapelbar“. Auch Züge können nicht Konstruktorparameter haben.

Hier ist, wie Züge gestapelt sind. Beachten Sie, dass die Reihenfolge der Merkmale wichtig sind. Sie werden sich gegenseitig anrufen von rechts nach links.

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

Andere Tipps

Die Website ein gutes Beispiel für Charakterzug Verwendung gibt. Ein großer Vorteil von Eigenschaften ist, dass Sie mehrere Züge erweitern können, aber nur eine abstrakte Klasse. Traits lösen viele der Probleme mit Mehrfachvererbung, aber erlauben die Wiederverwendung von Code.

Wenn Sie Rubin wissen, Züge ähneln-In mischte

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

Dies ist das beste Beispiel, das ich gesehen habe,

Scala in der Praxis: Composing Traits - Lego-Stil: http: //gleichmann.wordpress. com / 2009/10/21 / scala-in-Practice-Komponieren-Züge-lego-style /

    class Shuttle extends Spacecraft with ControlCabin with PulseEngine{

        val maxPulse = 10

        def increaseSpeed = speedUp
    }

Traits sind für die Funktionalität in einer Klasse zu mischen. Schauen Sie sich auf http://scalatest.org/ . Beachten Sie, wie Sie in verschiedenen domänenspezifischen Sprachen (DSL) in eine Testklasse mischen. Blick auf die Schnellstartanleitung auf einige der DSLs von Scalatest unterstützt suchen ( http://scalatest.org/quick_start)

ähnlich wie Schnittstellen in Java, sind Merkmale verwendet Objekttypen zu definieren, indem die Signatur der unterstützten Methoden angeben.

Im Gegensatz zu Java, ermöglicht Scala Züge teilweise umgesetzt werden; d ist es möglich, Standardimplementierungen für einige Methoden zu definieren.

Im Gegensatz zu den Klassen, Merkmale können nicht Konstruktorparameter haben. Traits sind wie Klassen, die aber definieren eine Schnittstelle von Funktionen und Felder, die Klassen konkrete Werte und Implementierungen liefern können.

Traits kann von anderen Merkmalen oder von Klassen erben.

Ich zitiere von der Website des Buchs Programmierung in Scala, First Edition und insbesondere der Abschnitt " um trait, oder nicht trait? “von Kapitel 12.

  

Wenn Sie eine wiederverwendbare Sammlung von Verhalten implementieren, müssen Sie entscheiden, ob Sie ein Merkmal oder eine abstrakte Klasse verwenden möchten. Es gibt keine feste Regel, aber dieser Abschnitt enthält einige Richtlinien zu berücksichtigen.

     

Wenn das Verhalten nicht wieder verwendet werden, dann machen sie eine konkrete Klasse. Es ist nicht wieder verwendbar Verhalten, nachdem alle.

     

Wenn es kann sich in mehreren, nicht verwandten Klassen wiederverwendet werden, machen es zu einem Merkmal. Nur Züge können in verschiedene Teile der Klassenhierarchie gemischt werden.

Es ist ein bisschen mehr Informationen in dem obigen Link in Bezug auf Eigenschaften und ich schlage vor, Sie den vollständigen Abschnitt lesen. Ich hoffe, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top