2015-08-25 19 views

risposta

62

Una classe final non può essere estesa, punto.

Un tratto di sealed può essere esteso nello stesso file sorgente come dichiarato. Questo è utile per creare ADT (tipi di dati algebrici). Un ADT è definito dalla somma dei tipi derivati.

Es .:

  • Un Option[A] è definita da Some[A] + None.
  • A List[A] è definito da :: + Nil.

sealed trait Option[+A] 

final case class Some[+A] extends Option[A] 
object None extends Option[Nothing] 

Perché Option[A] è sigillato, non può essere prorogato di altri sviluppatori - così facendo avrebbe alterato la sua significa.

Some[A] è finale perché non può essere esteso, punto.


Come bonus aggiuntivo, se un tratto è sigillato, il compilatore indica se le corrispondenze di pattern non sono abbastanza esaustivo perché sa che Option è limitata-Some e None.

opt match { 
    case Some(a) => "hello" 
} 

Attenzione: partita non può essere esaustivo. Fallirebbe sul seguente ingresso: None

+5

Tecnicamente parlando 'templates sealed' possono essere estesi nella stessa unità di compilazione * * , non lo stesso file. Il fatto che l'unità di compilazione del compilatore Scala sia uguale a un file è un dettaglio di implementazione. Potrebbero esserci altri compilatori che utilizzano, ad esempio, un database per memorizzare risorse utente di origine anziché il filesystem. –

+1

@ JörgWMittag Grazie per l'addendum, non ero a conoscenza di questa distinzione. – dcastro

4

sealed classi (o tratti) può ancora essere ereditata nello stesso file sorgente (dove final classi non possono essere ereditate a tutti).

Utilizzare sealed quando si desidera limitare il numero di sottoclassi di una classe base (vedere "Tipo di dati algebrico").

Come uno dei vantaggi molto pratici di tale restrizione il compilatore può ora mettere in guardia su modello non esaustivo partite:

sealed trait Duo 
case class One(i:Int) extends Duo 
case class Two(i:Int, j:Int) extends Duo 

def test(d:Duo) { 
    match { 
    case One(x) => println(x) // warning since you are not matching Two 
    } 
} 
+1

Tecnicamente i modelli 'sealed' possono essere estesi nella stessa * unità di compilazione *, non lo stesso file. Il fatto che l'unità di compilazione del compilatore Scala sia uguale a un file è un dettaglio di implementazione. Potrebbero esserci altri compilatori che utilizzano, ad esempio, un database per memorizzare risorse utente di origine anziché il filesystem. –