2010-10-10 20 views
13

He definido varios constructores, con algunos valores de argumento predeterminados en todos ellos. Parece correcto (no puedo ver ninguna ambigüedad), pero Scala (2.8) compilador se queja:¿No puedo definir los valores predeterminados si defino varios constructores sobrecargados en Scala?

multiple overloaded alternatives of constructor define default arguments

¿Quiere decir que no puedo definir valores por defecto para los constructores sobrecargados en absoluto?

Permítanme ilustrar la situación (primitivizado, por supuesto, pero ilustrativo):

 

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

¿Le importaría publicar el código que tiene con esto? –

Respuesta

9

Tomado directamente desde el código fuente del compilador:

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

En general, yo no lo aconsejaría usted mezcla sobrecarga y valores predeterminados. Incluso si no hay conflicto, puede hacer que su código sea más difícil de leer.

ACTUALIZACIÓN

Desde que agregó código, está claro ahora que usted no quiere/necesita para anular los valores predeterminados para cada constructor secundario. En su caso particular, incluso podría cuestionar la necesidad de esos constructores adicionales; Int => El doble ya está disponible para usted como una conversión implícita y String => Double parece que podría estar pervirtiendo el sistema de tipo :)

También ... Como alternativa a los constructores sobrecargados, puede definir solo el principal constructor con valores predeterminados, luego sobrecargue el método apply del objeto complementario y utilícelo como fábrica. Por supuesto, esto es completamente opcional, pero se está estableciendo rápidamente como un patrón mediante el uso de clases de casos.

+0

Usar fábricas parece bastante innecesario en el caso, y violar la navaja de Occam. Sería aún más bonito implementar constructores para todos los casos (aplicando manualmente los valores predeterminados) en mi humilde opinión, y así lo he hecho (parece demasiado antiguo y autorepetitivo). – Ivan

+0

Echaré un vistazo a mi código, si necesitaría estas cantidades de constructores. Apenas necesito uno en estos días ... – soc

+0

No tome mi voto de esta respuesta para decir que apruebo este límite de idioma. – FLGMwt

4

La sobrecarga falla porque usted (por error) define múltiples constructores con valores predeterminados. Haga esto en su lugar:

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

    def this (subject : Int) = { 
    this(subject.toDouble) 
    } 

    def this (subject : String) = { 
    this(subject.toDouble) 
    } 

    def this() = { 
    this(defaultSubject) 
    } 
} 
+0

Pero no factorizar y los argumentos DoItRight deben especificarse explícitamente si asunto Int o String en este caso? – Ivan

+0

¿Están predeterminados? – soc

+0

@Ivan, No, no necesita especificarlos, ya que ya ha establecido valores predeterminados para ellos en el constructor principal. –

Cuestiones relacionadas