2010-06-27 23 views
7

Provenendo da Java, sono confuso dalla distinzione classe/oggetto di scala. Nota che non chiedo la differenza formale; ci sono abbastanza riferimenti sul web che spiegano questo, e ci sono domande correlate su SO.Scala: le classi sono sufficienti?

Le mie domande sono:

  1. Perché i progettisti di scala choosed per rendere le cose più complicate (rispetto a Java o C# )? Quali svantaggi devo avere aspettarsi se ignoro questa distinzione e dichiari solo le classi?

Grazie.

+1

Perché consideri l'approccio che Scala ha assunto per essere più "complicato"?Dopo aver lavorato con ciascuna lingua, la soluzione di Scala è di gran lunga la più semplice, soprattutto quando entrano in gioco l'ereditarietà e la sub-tipizzazione. – soc

risposta

23

Java contengono due tipi completamente diversi di membri - membri di istanza (come ad esempio BigDecimal.plus) e membri statici (come ad esempio BigDecimal.valueOf). In Scala, ci sono solo membri di istanza. Questa è in realtà una semplificazione! Ma lascia un problema: dove mettiamo metodi come valueOf? Ecco dove gli oggetti sono utili.

class BigDecimal(value: String) { 
    def plus(that: BigDecimal): BigDecimal = // ... 
} 

object BigDecimal { 
    def valueOf(i: Int): BigDecimal = // ... 
} 

È possibile visualizzare questo come la dichiarazione di classe anonima e un singolo di un'istanza dello stesso:

class BigDecimal$object { 
    def valueOf(i: Int): BigDecimal = // ... 
} 
lazy val BigDecimal = new BigDecimal$object 

Durante la lettura di codice Scala, è fondamentale per distinguere i tipi di valori. Ho configurato IntelliJ per i tipi hightlight blu.

Java ha anche un altro grado di complessità rimosso in Scala: la distinzione tra campi e metodi. I campi non sono consentiti sulle interfacce, tranne se sono statici e definitivi; i metodi possono essere sovrascritti, i campi invece sono nascosti se ridefiniti in una sottoclasse. Scala elimina questa complessità e espone solo metodi al programmatore.

Infine, una risposta glib alla tua seconda domanda: se non si dichiara alcun oggetto, sei programma può mai eseguito, come di definire l'equivalente di public static void main(String... args) {} a Scala, è necessario almeno un oggetto!

+0

La parola chiave oggetto fornisce una classe singleton (comunque sotto il cofano) ed è la sostituzione di Scala per i membri statici. – apollodude217

+3

Ricorda che se hai una classe chiamata 'Something' e un oggetto chiamato' Something' (nello stesso pacchetto), allora questi due sono collegati - l'oggetto è l'oggetto * companion * della classe, e i due possono vedere gli altri membri privati. Confrontandolo con Java: pensa ai metodi della classe come metodi di istanza e ai metodi nell'oggetto come metodi statici che appartengono a quella classe. – Jesper

+1

Buon punto, Jesper. Inoltre, l'oggetto complementare 'T' di una classe o trait' T' si trova nell'ambito implicito nella ricerca di valori impliciti un tipo 'X', dato che' T' o un sottotipo di 'T' è una parte del tipo 'X'. Questo è usato per trovare viste implicite e argomenti impliciti. – retronym

0

Un modo per vederlo è questo. Un programma in esecuzione è costituito da una comunità di oggetti e thread. I thread eseguono il codice all'interno del contesto degli oggetti, ad esempio c'è sempre un "questo" oggetto all'interno del thread. Questa è una semplificazione da Java, nel senso che in Java non esiste sempre un "questo". Ma ora c'è un problema uovo/pollo. Se gli oggetti vengono creati da thread e thread vengono eseguiti all'interno di oggetti, quale oggetto è il primo thread inizialmente in esecuzione all'interno. Ci deve essere un insieme non vuoto di oggetti che esistono all'inizio dell'esecuzione del programma. Questi sono gli oggetti dichiarati con la parola chiave object.

Problemi correlati