Les classes scellées ou sealed dans kotlin

Partager

Une classe scellée est une classe qui retreint la hiérarchie de ses classes.Elle est donc utilisée pour représenter une hiérarchie de classe restreinte où une valeur ou un objet peut avoir l’un des types d’un ensemble de type.

Lorsque vous scellez une classe, vous limitez l’emplacement des ses sous classes.ses sous classes peuvent être déclarées soit dans le même fichier ( avant Kotlin 1.1 ) que la classe scellée soit au sein (à l’intérieur) de la classe scellée.

Table des matières

La différence entre une classe scellée et une énumération

Vous pouvez voir une classe scellée comme une extension aux énumérations car l’ensemble des valeurs d’une énumération est également restreint. Mais il n’existe qu’une seule instance de chaque constant d’une énumération alors qu’une sous classe d’une classe scellée peut avoir plusieurs instances pouvant contenir un état.

Déclarer une classe scellée ou sealed

Pour déclarer une classe comme étant scellée, vous devez la marquer avec le mot clé sealed avant le nom de la classe comme suit.

sealed class Personne

L’utilité des classes scellées

Vous allez comprendre l’utilité des classes scellées et savoir quand utiliser les classes scellées dans votre projet. Les classes scellées sont essentiellement utiles lorsque vous les utilisez dans une évaluation avec une expression when .

Par exemple supposons que vous souhaitez créer une classe Forme qui a deux (2) sous classes Carre, Rectangle dont voici l’implémentation.

open class Forme(val longueur: Int,val largeur: Int){
  
}
class Rectangle (longueur: Int,largeur: Int) :Forme(longueur,largeur){

}
class Carre (longueur: Int,largeur: Int) :Forme(longueur,largeur){

}

Ensuite vous souhaitez par exemple créer une instance de la classe Rectangle et utilisé une expression when pour évaluer le type de forme dont il s’agit durant l’exécution du programme comme suit.

fun main(){
 val rectangle=Rectangle(200,200)
  println(check(rectangle))
}
fun check(forme:Forme):String{
 val mforme=when(forme){
  is Rectangle ->"C'est un rectangle"
  is Carre -> "C'est un carre"
  else ->"Ce n'est pas une forme"
 }
 return  mforme
}

Résultat:C’est un rectangle

Vous devez constater que lorsque vous utilisez l’expression when dans la fonction check, le compilateur génère une erreur: when expression must be exhaustive,add necessary else branch si vous n’ajouter pas une branche else. Lisez le tutoriel sur l’expression when ici.

Ce qu’on souhaitait faire en réalité c’est juste vérifier si le type de la valeur est une sous classe de la classe Forme alors que là, l’expression when nous impose de mettre en plus une branche else .Tandis que que le code dans la branche else n’est pas vraiment ce qu’on souhaite exécuter.

Encore plus, lorsque vous ajoutez par exemple une classe Cercle comme sous classe de la classe Forme, le compilateur n’est pas capable de le détecter et vous demander d’ajouter une branche else pour la classe Cercle dans l’expression when. Donc si vous créer une instance de la classe Cercle et que vous appelez encore la fonction check, la compilateur va exécuter la branche else.

Voir l’exemple

fun main(){
 val rectangle=Cercle(200,200)
  println(check(rectangle))
}
fun check(forme:Forme):String{
 val mforme=when(forme){
  is Rectangle ->"C'est un rectangle"
  is Carre -> "C'est un carre"
  else ->"Ce n'est pas une forme"
 }
 return  mforme
}
open class Forme(val longueur: Int,val largeur: Int){

}
class Rectangle (longueur: Int,largeur: Int) :Forme(longueur,largeur){

}
class Carre (longueur: Int,largeur: Int) :Forme(longueur,largeur){

}
class Cercle (longueur: Int,largeur: Int) :Forme(longueur,largeur){

}

Résultat: Ce n’est pas une forme

Vous pouvez résoudre ce problème avec les classes scellées.Avec une classe scellée, le compilateur est capable de détecter quand vous devez évaluer toutes les sous classes de la classe scellée et vous n’aurez plus besoin d’ajouter une branche else.

De plus dès que vous ajoutez une nouvelle sous classe dans la classe scellée, le compilateur est capable de le détecter et vous imposer d’ajouter une branche pour cette nouvelle classe dans l’expression when.

les classes scellées et l’expression when

Nous allons apprendre à utiliser une classe scellée avec une expression when. Pour cela,vous devez transformer la classe Forme en une classe scellée avec le mot clé sealed comme suit.

fun main(){
 val rectangle=Forme.Rectangle(200,200)
  println(check(rectangle))
}
fun check(forme:Forme):String{
 val mforme=when(forme){
  is Forme.Rectangle ->"C'est un rectangle"
  is Forme.Carre -> "C'est un carre"
  is Forme.Cercle -> "C'est un cercle"
 }
 return  mforme
}
sealed class Forme(val longueur: Int,val largeur: Int){
 class Rectangle (longueur: Int,largeur: Int) :Forme(longueur,largeur){

 }
 class Carre (longueur: Int,largeur: Int) :Forme(longueur,largeur){

 }
 class Cercle (longueur: Int,largeur: Int) :Forme(longueur,largeur){

 }
}

Résultat: C’est un rectangle

Conclusion

Voila, nous sommes à la fin de ce tutoriel sur les classes scellé(sealed) dans kotlin. J’espère que ce tutoriel vous aidera.A bientôt pour un nouveau tutoriel.

Autres Ressources

https://kotlinlang.org/docs/reference/sealed-classes.html


Partager

Laisser un commentaire

Résoudre : *
17 − 10 =


%d