2011-09-28 13 views
11

che sto cercando di ottenere una migliore comprensione della Scala, e io non riesco a trovare un caso d'uso valida per il codice come il seguente:Qual è lo scopo di estendere un tipo anonimo in Scala?

class C extends { def m() { /* ... */ } } 

Qual è la logica per consentire tali costrutti?

Grazie!

+2

L'esempio fornito non è un tipo strutturale, ma una classe anonima. Non che spieghi perché puoi estenderlo ... –

+0

Proprio così, ho aggiornato il titolo – Eyvind

risposta

12

Immagino che l'unica spiegazione logica qui sia "evitare casi speciali se possibile". È possibile estendere qualsiasi classe, una classe anonima è una classe, quindi è possibile estendere una classe anonima.

+0

Probabilmente hai ragione (+1). Mi piacerebbe un caso d'uso reale, però, se ne esiste davvero uno :) – Eyvind

+1

Non penso che ce ne sia uno ... –

+0

Sono d'accordo con Kim, l'ereditarietà consente di condividere comportamenti o rappresentare una determinata gerarchia. Ma se la classe genitore in anonimo, non puoi avere due classi figlie che estendono la stessa classe genitore. – paradigmatic

11

Non è, in effetti, una classe anonima! È un inizializzatore anticipato e viene eseguito come parte del costruttore che precede la sua superclasse. Citando la risposta eccellente da another stackoverflow question:

abstract class X { 
    val name: String 
    val size = name.size 
} 

class Y extends { 
    val name = "class Y" 
} with X 

Se il codice fosse scritta, invece, come

class Z extends X { 
    val name = "class Z" 
} 

quindi un'eccezione di puntatore nullo sarebbe verificato quando Z ottenuto inizializzato, perché la dimensione è inizializzata prima del nome nel normale ordinamento dell'inizializzazione (superclasse prima della lezione).

1

Si chiama Early definitions e si occupano del problema dell'ordine di inizializzazione di super classe.