un tratto sigillato è lo stesso di una classe sigillata?
Per quanto riguarda sealed
, sì, sì. Condividono le normali differenze tra trait
e class
, ovviamente.
Oppure, in caso contrario, quali sono le differenze?
Moot.
Quando è consigliabile utilizzare un tratto sigillato (e quando non lo è)?
Se si dispone di un sealed class X
, poi si deve verificare la presenza di X
così come qualsiasi sottoclassi. Lo stesso non è vero per sealed abstract class X
o sealed trait X
. Quindi potresti fare sealed abstract class X
, ma è molto più verboso del solo trait
e per un piccolo vantaggio.
Il vantaggio principale dell'utilizzo di abstract class
su un trait
è che può ricevere parametri. Questo vantaggio è particolarmente rilevante quando si usano classi di tipi. Supponiamo che tu voglia costruire un albero ordinato, ad esempio.È possibile scrivere questo:
sealed abstract class Tree[T : Ordering]
, ma non si può fare questo:
sealed trait Tree[T : Ordering]
dal limite di contesto (e visualizzare i limiti) sono implementate con i parametri impliciti. Dato che i tratti non possono ricevere parametri, non puoi farlo.
Personalmente, preferisco sealed trait
e lo uso a meno che qualche motivo particolare mi faccia usare un sealed abstract class
. E non sto parlando di ragioni impercettibili, ma di ragioni in-faccia che non puoi ignorare, come usare le classi di tipi.
fonte
2012-06-26 16:48:33
Grazie. Con "tutte le sue sottoclassi" significa classi e tratti? –
Downvoted perché? –
@ John - Non ho provato, ma sospetto le lezioni. Il punto sulla sigillatura è che tutto è definito all'interno di quell'unica unità sorgente –