2012-06-28 16 views
5

Eventuali duplicati:
What is the difference between scala self-types and trait subclasses?Che cosa si intende per auto-annotazione di un oggetto?

capisco un self-un'annotazione come una promessa per il compilatore, in cui il programmatore manifesta che un tratto verrà MixIn con quello annotato. Per esempio:

scala> trait X 
defined trait X 

scala> trait Y { this: X => } 
defined trait Y 

scala> new Y {} 
<console>:10: error: illegal inheritance; 
self-type Y does not conform to Y's selftype Y with X 
       new Y {} 
       ^

scala> new Y with X {} 
res1: Y with X = [email protected] 

Nell'esempio precedente, la terza espressione non è riuscita perché non abbiamo fissato un X valida alla nuova istanza. Ovviamente, l'ultimo funziona bene. Fin qui tutto bene. E ora, vediamo un altro esempio che riguarda un oggetto.

scala> object Z { this: X => } 
defined module Z 

Capisco l'oggetto viene creata un'istanza in mancanza con la X promessa (stiamo creando un'istanza ora con una promessa futura!), Come rappresentato nelle prossime righe, in cui i tratti sono stati leggermente modificati:

scala> trait X { class X1 } 
defined trait X 

scala> trait Y { this: X => new X1 } 
defined trait Y 

scala> object Z { this: X => new X1 } 
<console>:8: error: not found: type X1 
     object Z { this: X => new X1 } 
           ^

Quindi, cosa implica l'auto-annotazione dell'oggetto?

risposta

3

In effetti, puoi fare la stessa cosa con le classi - aggiungi un self-type che non è ereditato, ma non sarai in grado di creare un'istanza di tale classe.

Consentire agli oggetti singleton di avere tipi di autodiagnosi non invalida in alcun modo i programmi: semplicemente non sarà possibile chiamare nessuno dei metodi del tipo di sé (o creare un'istanza delle sue classi interne) dall'oggetto singleton, perché non ha ereditato il self-type.

Tuttavia, potrebbe trattarsi di un bug, è possibile che si desideri file a bug.

+0

Penso che nel caso di classe, ad esempio: "classe A {questo: X => nuovo X1}" puoi giocare con "nuova A con X", quindi ha senso, ma non riesco a trovare alcuna situazione in cui potrebbe essere necessario l'auto-annotazione in un oggetto. – jeslg

+0

Vero, per gli oggetti e le classi finali, non ha senso che io possa vedere. – axel22

+0

Attenzione, penso che gli oggetti possano essere sovrascritti se sono membri di un tratto o di una classe. –