Comment fournir des constructeurs surchargés dans Scala?
135
Il convient de mentionner explicitement que les constructeurs auxiliaires de Scala doivent soit appeler la réponse du constructeur principal (comme dans landon9720), soit un autre constructeur auxiliaire de la même classe, comme première action. Ils ne peuvent pas simplement appeler le constructeur de la superclasse explicitement ou implicitement comme ils le peuvent en Java. Cela garantit que le constructeur principal est le seul point d'entrée de la classe.
class Foo(x: Int, y: Int, z: String) {
// default y parameter to 0
def this(x: Int, z: String) = this(x, 0, z)
// default x & y parameters to 0
// calls previous auxiliary constructor which calls the primary constructor
def this(z: String) = this(0, z);
}
new Foo(x=2,z=4)
etnew Foo(z=5)
si vous changez votre première ligne enclass Foo(x: Int = 0, y: Int = 0, z: String) {
new
mot-clé soit nécessaire même pour les classes de cas.la source
Depuis Scala 2.8.0, vous pouvez également avoir des valeurs par défaut pour les paramètres du constructeur et de la méthode. Comme ça
Les paramètres avec des valeurs par défaut doivent venir après ceux sans valeurs par défaut dans la liste des paramètres.
la source
class Foo(val x:Int, y:Int=2*x)
ne fonctionne pas.new Foo(x=2,z=4)
imprimeraFoo(2,0,4)
.En regardant mon code, je me suis soudainement rendu compte que j'avais une sorte de surcharge d'un constructeur. Je me suis alors souvenu de cette question et suis revenu pour donner une autre réponse:
Dans Scala, vous ne pouvez pas surcharger les constructeurs, mais vous pouvez le faire avec des fonctions.
De plus, beaucoup choisissent de faire de la
apply
fonction d'un objet compagnon une fabrique pour la classe respective.En rendant cette classe abstraite et en surchargeant la
apply
fonction pour implémenter-instancier cette classe, vous avez votre «constructeur» surchargé:Notez que je définis explicitement chacun
apply
pour retournerExpectation[T]
, sinon cela renverrait un type de canardExpectation[T]{val expected: List[T]}
.la source
Essaye ça
la source