Kann jemand bitte Eigenschaften in Scala erklären? Was sind die Vorteile von Merkmalen gegenüber der Erweiterung einer abstrakten Klasse?
81
Die kurze Antwort lautet, dass Sie mehrere Merkmale verwenden können - sie sind "stapelbar". Außerdem können Merkmale keine Konstruktorparameter haben.
So werden Merkmale gestapelt. Beachten Sie, dass die Reihenfolge der Merkmale wichtig ist. Sie rufen sich von rechts nach links an.
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
}
}
Diese Seite bietet ein gutes Beispiel für die Verwendung von Merkmalen. Ein großer Vorteil von Merkmalen ist, dass Sie mehrere Merkmale, aber nur eine abstrakte Klasse erweitern können. Merkmale lösen viele der Probleme mit Mehrfachvererbung, ermöglichen jedoch die Wiederverwendung von Code.
Wenn Sie Ruby kennen, ähneln die Eigenschaften Mix-Ins
quelle
quelle
Dies ist das beste Beispiel, das ich gesehen habe
Scala in der Praxis: Eigenschaften komponieren - Lego-Stil: http://gleichmann.wordpress.com/2009/10/21/scala-in-practice-composing-traits-lego-style/
quelle
Merkmale sind nützlich, um Funktionen in eine Klasse zu mischen. Schauen Sie sich http://scalatest.org/ an . Beachten Sie, wie Sie verschiedene domänenspezifische Sprachen (DSL) in eine Testklasse mischen können. In der Kurzanleitung finden Sie einige der von Scalatest unterstützten DSLs ( http://scalatest.org/quick_start ).
quelle
Ähnlich wie bei Schnittstellen in Java werden Merkmale verwendet, um Objekttypen durch Angabe der Signatur der unterstützten Methoden zu definieren.
Im Gegensatz zu Java können mit Scala Merkmale teilweise implementiert werden. dh es ist möglich, Standardimplementierungen für einige Methoden zu definieren.
Im Gegensatz zu Klassen haben Merkmale möglicherweise keine Konstruktorparameter. Merkmale sind wie Klassen, definieren jedoch eine Schnittstelle von Funktionen und Feldern, über die Klassen konkrete Werte und Implementierungen liefern können.
Merkmale können von anderen Merkmalen oder von Klassen erben.
quelle
Ich zitiere aus der Website des Buches Programmierung in Scala, Erstausgabe und genauer gesagt aus dem Abschnitt " Zu Merkmalen oder nicht zu Merkmalen? " Aus Kapitel 12.
Der obige Link enthält etwas mehr Informationen zu Merkmalen, und ich schlage vor, dass Sie den vollständigen Abschnitt lesen. Ich hoffe das hilft.
quelle