2010-09-25 4 views
1

Je me demande s'il est possible d'hériter de constructeurs auxiliaires dans Scala?Est-il possible d'hériter des constructeurs auxiliaires dans Scala?

J'ai testé ce code, et il se plaignait

temp.scala:18: error: too many arguments for constructor Child:()this.Child

val a = new Child(42)

^
abstract class Father { 
var value: Int = 0 

protected def setValue(v: Int) = { 
    value = v 
} 

protected def this(v: Int) = { 
    this() 
    setValue(v) 
} 
} 

class Child extends Father { 
} 

val a = new Child(42) 

Mais si je mets

protected def this(v: Int) = { 
    this() 
    setValue(v) 
} 

dans la classe de l'enfant, tout va bien.

+1

Sur la preuve que vous avez fourni, « Non ». –

+1

Question connexe (et réponse): http://stackoverflow.com/questions/1095329/scala-constructor-overload/1096534#1096534 –

+1

Les constructeurs ne sont pas hérités. Pas à Scala, pas à Java. Pas primaires, pas secondaires. –

Répondre

2

Absolument pas, et votre exemple montre pourquoi. Vous avez introduit une variable mutable value qui peut être initialisée ou non - en fonction du constructeur exact utilisé. Il s'agit d'une source potentielle pour de nombreux problèmes, et Scala a donc décidé que toute création d'objet devrait finalement être dirigée via le constructeur primaire, ceci assurant une initialisation cohérente.

Si vous voulez value avoir une valeur par défaut, vous pouvez spécifier comme paramètre par défaut (en 2.8+):

abstract class Father(val value : Int = 0) 

ou vous pouvez utiliser le constructeur auxiluary pour obtenir le même effet dans Scala 2.7:

abstract class Father(val value : Int) { 
    def this() = this(0) 
} 

Avec Father défini dans l'une des manières ci-dessus, les définitions suivantes de l'enfant sont valides:

class Child(v:Int) extends Father(v) 

class Child extends Father() 

Vous pouvez également faire value une var si vous devez absolument, mais je déconseille fortement.

Si la sémantique de value signifie qu'il est correct de ne pas procéder à l'initialisation, le langage correct Scala est de le déclarer comme Option[Int]:

abstract class Father(val value : Option[Int] = Some(0)) 
1

Votre constructeur enfant n'a aucun paramètre et vous essayez de l'instancier avec un! Vous devez déclarer un paramètre dans votre constructeur Child puis passer à la classe Father, par exemple:

class Child(v:Int) extends Father(v) { 
} 

val a = new Child(42) 
Questions connexes