162 votes

Constructeur secondaire Kotlin

Comment déclarer un constructeur secondaire en Kotlin ?

Y a-t-il de la documentation à ce sujet ?

Le code suivant ne compile pas...

class C(a : Int) {
  // Constructeur secondaire
  this(s : String) : this(s.length) { ... }
}

10voto

Hitesh Sahu Points 12561

Exemple de vue personnalisée avec plusieurs constructeurs en Android:

class ShaderBackground : View {

    constructor(context: Context) : super(context) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
        init()
    }

    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(
        context,
        attrs,
        defStyleAttr
    ) {
        init()
    }

    private fun init() {

       // Initialisation du contenu ici
        paint = Paint();
        paint.strokeWidth = 10f;
        paint.style = Paint.Style.FILL_AND_STROKE;

    }

7voto

Vous pouvez définir plusieurs constructeurs en Kotlin avec constructor mais vous devez ignorer le constructeur par défaut class AuthLog(_data: String)

class AuthLog {

    constructor(_data: String): this(_data, -1)

    constructor(_numberOfData: Int): this("From count ", _numberOfData)

    private constructor(_data: String, _numberOfData: Int)

}

Pour plus de détails, voir ici

Mise à jour

Maintenant, vous pouvez définir le constructeur par défaut

class AuthLog(_data: String, _numberOfData: Int) {

    constructor(_data: String): this(_data, -1) {
        //TODO: Ajoutez du code ici si vous le souhaitez
    }

    constructor(_numberOfData: Int): this("From count", _numberOfData)

}

4voto

caeus Points 7

Je viens de voir cette question et je pense qu'il pourrait y avoir une autre technique qui semble encore meilleure que celles proposées par Andrey.

class C(a: Int) {
    class object {
        fun invoke(name: String) = C(name.length)
    }        
}

Vous pouvez écrire quelque chose comme val c:C = C(3) ou val c:C = C("abc"), car les méthodes invoke fonctionnent de la même manière que les méthodes apply en Scala.

Mise à jour

A partir de maintenant, les constructeurs secondaires font déjà partie de la spécification du langage, donc cette solution de contournement ne devrait pas être utilisée.

2voto

user2853418 Points 146

Le extrait de code ci-dessous devrait fonctionner

class  C(a:Int){
  constructor(s:String):this(s.length){..}
}

1voto

Ruhul Points 39
class Person(val name: String) {
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}

vous pouvez essayer ceci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X