web-dev-qa-db-fra.com

Comment étendre une classe de données avec toString

J'ai créé une classe de données

data class Something (
    val a : String,
    val b : Object,
    val c : String
)

comme plus tard dans mon programme, j'ai besoin de la représentation sous forme de chaîne de cette classe de données, j'ai essayé d'étendre la méthode toString.

override fun Something.toString() : String = a + b.result() + c

Le problème ici est qu'il ne permet pas d'étendre (remplacer) la fonction toString, car il n'est pas applicable aux fonctions de niveau supérieur.

Comment remplacer/étendre correctement la méthode toString d'une classe de données personnalisée?

29
Aleksandar

Dans Kotlin, les fonctions d'extension ne peuvent pas remplacer les fonctions membres, de plus, elles sont résolues statiquement . Cela implique que si vous écrivez une fonction d'extension, fun Something.toString() = ..., s.toString() ne sera pas résolu, car le membre gagne toujours .

Mais dans votre cas, rien ne vous empêche de remplacer toString à l'intérieur du corps de classe Something, car les classes data peuvent avoir des corps comme les classes normales:

data class Something(
    val a: String,
    val b: Any,
    val c: String
) {
    override fun toString(): String = a + b + c
}
53
hotkey