2010-10-10 13 views
13

Ho definito più costruttori, con alcuni valori di argomento predefiniti in tutti loro. Sembra corretto (non riesco a vedere alcuna ambiguità), ma Scala (2.8) compilatore si lamenta:Non è possibile definire i valori predefiniti se definisco più costruttori sovraccaricati in Scala?

multiple overloaded alternatives of constructor define default arguments

Vuol dire che non riesco a definire i valori predefiniti per costruttori di overload a tutti?

Permettetemi di illustrare la situazione (stato primitivo, naturalmente, ma illustrativo):

 

class A(subject : Double, factor : Int = 1, doItRight : Boolean = true) { 

    def this (subject : Int, factor : Int = 1, doItRight : Boolean = true) = { 
    this(subject.toDouble , factor, doItRight) 
    } 

    def this (subject : String, factor : Int = 1, doItRight : Boolean = true) = { 
    this(subject.toDouble , factor, doItRight) 
    } 

    def this() = { 
    this(defaultSubject) 
    } 

} 


 
+1

Ti dispiacerebbe postare il codice che hai con questo? –

risposta

9

presi direttamente dal codice sorgente del compilatore:

// only one overloaded alternative is allowed to define default arguments 

In generale, non vorrei consigliare che mescoli sovraccarico e valori predefiniti. Anche se non c'è conflitto, può rendere più difficile leggere il tuo codice.

UPDATE

Dal momento che è stato aggiunto il codice, è chiaro ora che non si vuole/bisogno di ignorare i valori predefiniti per ogni costruttore secondario. Nel tuo caso particolare, potrei persino mettere in dubbio la necessità di quei costruttori extra; Int => Double è già disponibile per te come conversione implicita e String => Double sembra che tu possa pervertire il sistema dei tipi :)

Inoltre ... Come alternativa ai costruttori sovraccaricati, puoi definire solo il primario costruttore con valori predefiniti, quindi sovraccaricare il metodo apply dell'oggetto companion e utilizzarlo come factory. Questo è ovviamente completamente facoltativo, ma sta rapidamente diventando un modello attraverso l'uso di classi di casi.

+0

L'utilizzo di fabbriche sembra abbastanza inutile nel caso e la violazione del rasoio di Occam. Sarebbe ancora più bello implementare i costruttori per tutti i casi (applicando manualmente i valori predefiniti) IMHO, e così ho fatto (sembra troppo vecchio e ripetitivo anche se). – Ivan

+0

Vorrei dare un'occhiata al mio codice, se avessi bisogno di queste quantità di costruttori. Non ho quasi bisogno di uno solo in questi giorni ... – soc

+0

Si prega di non prendere la mia upvote di questa risposta per significare che approvo questo limite di lingua. – FLGMwt

4

L'overloading non riesce perché (non) si definiscono più costruttori con valori predefiniti. Fatelo invece:

+0

Ma gli argomenti doItRight e factor non devono essere specificati esplicitamente se il soggetto Int o String in questo caso? – Ivan

+0

Sono predefiniti? – soc

+0

@Ivan, No, non è necessario specificarli, poiché hai già impostato valori predefiniti per loro nel costruttore principale. –

Problemi correlati