Frage

Kurze Anmerkung: Beispiele aus dem Tutorial Scala für Java Flüchtlinge Teil 5:. Traits und Typen

Angenommen ich die Züge Schüler haben, Arbeiter, Geunterbezahlter und Young.

Wie kann ich erklären, eine Klasse ( nicht Instanz ), CollegeStudent, mit all diesen Eigenschaften?

Hinweis: Ich bin mir bewusst, der simplests Fällen, wie CollegeStudent mit einem oder zwei Merkmale:

class CollegeStudent extends Student with Worker
War es hilfreich?

Lösung

Es ist leicht, wenn die Deklaration einer Klasse verwenden Sie einfach die „mit“ Schlüsselwort, so oft Sie wollen

class CollegeStudent extends Student with Worker with Underpaid with Young

die Reihenfolge der Züge wichtig sein kann, wenn ein Merkmal, das Verhalten der Klasse verändert sich, es hängt alles von Merkmalen Sie verwenden.

Auch wenn Sie eine Klasse nicht haben wollen, die immer die gleichen Merkmale verwendet man kann sie später verwenden:

class CollegeStudent extends Student
new CollegeStudent with Worker with Underpaid with NotSoYoungAnymore

Andere Tipps

Ich denke, dass es sehr wichtig ist, nicht nur die Syntax zu erklären, aber auch, welche Rolle spielt dabei die Reihenfolge der Züge spielt . Ich fand die Erklärung in Jason Swartz Learning Scala (Seite 177) ganz Enlightning.

  • Eine Scala Klasse können mehrere Züge verlängern, aber JVM-Klassen können nur ein Elternteil Klasse erweitern. Die Scala-Compiler löst dieses Problem durch die Schaffung von „ Kopien jedes Merkmal eine große, einspaltig Hierarchie der Bildung Klasse und Eigenschaften “, ein Prozess bekannt als Linearisierungs .

  • In diesem Zusammenhang würde mehrere Züge mit identischen Feldnamen verlauf nicht kompiliert, genau die gleiche „ als ob Sie eine Klasse ausdehnten und Ihre eigene Version der Bereitstellung eines Verfahrens scheiterten aber eine Überschreibung hinzufügen Stichwort “.

Und da es die Form des Vererbungsbaums bestimmt, ist die Linearisierung, um in der Tat eine sehr wichtige Frage zu betrachten. Als Beispiel ist class D extends A with B with C (wobei A eine Klasse und B und C sind Züge) würde class D extends C extends B extends A werden. Die folgenden Zeilen, auch aus dem Buch zeigen, dass perfekt:

trait Base { override def toString = "Base" }
class A extends Base { override def toString = "A->" + super.toString }
trait B extends Base { override def toString = "B->" + super.toString }
trait C extends Base { override def toString = "C->" + super.toString }
class D extends A with B with C { override def toString = "D->" + super.toString }

Ein Aufruf new D() würde die REPL drucken haben die folgende:

 D->C->B->A->Base

, die perfekt die Struktur des linearisierte Vererbungsgraphen widerspiegelt.

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