374 Stimmen

Was ist ein versiegeltes Merkmal?

Versiegelte Klassen werden in "Programming in Scala" beschrieben, versiegelte Traits jedoch nicht. Wo kann ich mehr Informationen über versiegelte Eigenschaften finden?

Ich würde gerne wissen, ob ein versiegelter Trait dasselbe ist wie eine versiegelte Klasse? Oder, falls nicht, was sind die Unterschiede? Wann ist es eine gute Idee, eine versiegelte Eigenschaft zu verwenden (und wann nicht)?

526voto

paradigmatic Punkte 39621

A sealed Trait kann nur in derselben Datei wie seine Deklaration erweitert werden.

Sie werden häufig als Alternative zu folgenden Maßnahmen eingesetzt enums . Da sie nur in einer einzigen Datei erweitert werden können, kennt der Compiler alle möglichen Subtypen und kann darauf schließen.

Zum Beispiel mit der Erklärung:

sealed trait Answer
case object Yes extends Answer
case object No extends Answer

Der Compiler gibt eine Warnung aus, wenn eine Übereinstimmung nicht erschöpfend ist:

scala> val x: Answer = Yes
x: Answer = Yes

scala> x match {
     |   case No => println("No")
     | }
<console>:12: warning: match is not exhaustive!
missing combination            Yes

Sie sollten also versiegelte Eigenschaften (oder versiegelte abstrakte Klassen) verwenden, wenn die Anzahl der möglichen Subtypen endlich und im Voraus bekannt ist. Für weitere Beispiele können Sie einen Blick werfen auf Liste y Option Implementierungen.

98voto

Daniel C. Sobral Punkte 290004

ist ein versiegelter Trait dasselbe wie eine versiegelte Klasse?

Soweit sealed geht, ja. Sie teilen die normalen Unterschiede zwischen trait y class natürlich.

Oder, wenn nicht, was sind die Unterschiede?

Strittig.

Wann ist es eine gute Idee, eine versiegelte Eigenschaft zu verwenden (und wann nicht)?

Wenn Sie eine sealed class X dann müssen Sie prüfen, ob X sowie alle Unterklassen. Das Gleiche gilt nicht für sealed abstract class X o sealed trait X . Sie könnten also Folgendes tun sealed abstract class X aber das ist viel ausführlicher als nur trait und für einen geringen Vorteil.

Der Hauptvorteil der Verwendung eines abstract class über eine trait ist, dass sie Parameter empfangen kann. Dieser Vorteil ist besonders bei der Verwendung von Typklassen von Bedeutung. Nehmen wir an, Sie wollen zum Beispiel einen sortierten Baum erstellen. Sie können dies schreiben:

sealed abstract class Tree[T : Ordering]

aber das können Sie nicht tun:

sealed trait Tree[T : Ordering]

da Context Bounds (und View Bounds) mit impliziten Parametern implementiert werden. Da Traits keine Parameter empfangen können, ist das nicht möglich.

Ich persönlich bevorzuge sealed trait und verwende sie, es sei denn, ich muss aus einem bestimmten Grund eine sealed abstract class . Und ich spreche nicht von subtilen Gründen, sondern von offensichtlichen Gründen, die Sie nicht ignorieren können, wie die Verwendung von Typklassen.

58voto

Brian Agnew Punkte 260470

Von der daily-scala blog :

Wenn eine Eigenschaft "versiegelt" ist, werden alle ihre Unterklassen in derselben Datei deklariert derselben Datei deklariert, wodurch die Menge der Unterklassen endlich wird und bestimmte Compiler-Prüfungen.

31voto

A T Punkte 11608

Außerdem möchte ich Sie auf die Spezifikationen hinweisen:

En versiegelt modier gilt für Klassenbezeichnungen. A versiegelt Klasse darf nicht direkt vererbt werden, es sei denn, die vererbende Vorlage ist in derselben Quelle enthalten Datei wie die geerbte Klasse enthalten ist. Unterklassen einer versiegelten Klasse können jedoch überall geerbt werden.

- M. Odersky. The Scala language specification, version 2.8. online, Sept. 2013.

9voto

Majid Hosseini Punkte 1048

Kurz und bündig:

  • Versiegelte Eigenschaften können nur in derselben Datei erweitert werden
  • Mit dieser Liste kann der Compiler leicht alle möglichen Subtypen kennen
  • Versiegelte Merkmale verwenden, wenn die Anzahl der möglichen Subtypen endlich und im Voraus bekannt ist
  • Eine Möglichkeit, etwas wie enum in Java zu erstellen
  • Hilfe bei der Definition algebraischer Datentypen (ADTs)

und für weitere Einzelheiten Alles über versiegelte Traits in Scala

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X