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.