Ein versiegeltes Merkmal ist dasselbe wie eine versiegelte Klasse?
Soweit sealedja. Sie teilen natürlich die normalen Unterschiede zwischen traitund 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 XUnterklassen suchen. Das gleiche gilt nicht für sealed abstract class Xoder sealed trait X. Sie könnten es also tun sealed abstract class X, aber das ist viel ausführlicher als nur traitund für wenig Vorteil.
Der Hauptvorteil der Verwendung von a abstract classüber a traitbesteht 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 traitund 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.