Ein versiegeltes Merkmal ist dasselbe wie eine versiegelte Klasse?
Soweit sealed
ja. Sie teilen natürlich die normalen Unterschiede zwischen trait
und class
.
Oder wenn nicht, was sind die Unterschiede?
Moot.
Wann ist es eine gute Idee, ein versiegeltes Merkmal zu verwenden (und wann nicht)?
Wenn Sie eine haben sealed class X
, müssen Sie nach X
Unterklassen suchen. Das gleiche gilt nicht für sealed abstract class X
oder sealed trait X
. Sie könnten es also tun sealed abstract class X
, aber das ist viel ausführlicher als nur trait
und für wenig Vorteil.
Der Hauptvorteil der Verwendung von a abstract class
über a trait
besteht darin, dass Parameter empfangen werden können. Dieser Vorteil ist besonders relevant bei der Verwendung von Typklassen. Angenommen, Sie möchten beispielsweise einen sortierten Baum erstellen. Sie können dies schreiben:
sealed abstract class Tree[T : Ordering]
aber du kannst das nicht tun:
sealed trait Tree[T : Ordering]
da Kontextgrenzen (und Ansichtsgrenzen) mit impliziten Parametern implementiert werden. Da Merkmale keine Parameter empfangen können, können Sie dies nicht tun.
Persönlich bevorzuge sealed trait
und benutze ich es , es sei denn, ein bestimmter Grund zwingt mich dazu, a zu verwenden sealed abstract class
. Und ich spreche nicht über subtile Gründe, sondern über Gründe, die Sie nicht ignorieren können, z. B. die Verwendung von Typklassen.