Soit la hiérarchie de classes suivantes (vous noterez que créer une classe en Kotlin est bien plus simple qu'en Java) :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | class Figure class Rectangle(val largeur: Double val longueur: Double) : Figure { fun perimetre(): Double = 2*(largeur + longueur) } class Cercle(val centre: Point, val rayon: Double) : Figure { fun aire() : Double { return 2*Math.PI*rayon } } |
Quatre remarques importantes :
- On déclare le constructeur en même temps que la classe. (Comment alors définir plusieurs constructeurs ? Cela sera l'objet d'un billet ultérieur),
- Pour dériver une classe, on utilise la syntaxe ": <Classe de Base>", avec éventuellement les paramètres renseignés pour le constructeur de la classe de base (Idem pour le cas des constructeurs multiples pour la classe de base : ce sera l'objet d'un billet ultérieur),
- On déclare le type d'une variable avec la syntaxe "val <NomVariable> : <Type>" , comme vu dans le billet précédent sur l'immutabilité,
- Enfin le fait de déclarer un paramètre comme val permet de créer automatiquement un getter (et aucun setter) pour la variable déclarée tandis que l'utilisation de var permet de générer automatiquement à la fois un getter et un setter pour la dite propriété.
Je vous prie de ne pas attacher trop d'importante à la syntaxe de déclaration de fonctions/méthodes (notamment aire() et perimetre()) pour l'instant.
Ainsi, le code suivant est valide :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | class Adress(val ville: String, val codePostal: Int) class Person(val nom: String, val prenom: String, var adress: Adress) val noemie = Person("Tartempion", "Noemie", Adress("Troyes", 10420)) println(noemie.adress.ville) // afficher du texte sur la sortie standard est bien plus simple en Kotlin. noemie.adress = ("Strasbourg", 67000) // En revanche le code suivant provoquera une erreur de compilation noemie.prenom = "Toto" //De même celui-là noemie.adress.codePostal = 15200 |
Il me manque aussi la classe Point :
Code : | Sélectionner tout |
1 2 | class Point(val x: Double, val y: Double) |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | val allFigures = arrayOf(Rectangle(10.0, 20.0), Cercle(Point(5.0, -15.0), 20.0) // Déclare un simple tableau de Figures (polymorphique) // Ecriture equivalente : val allFigures = arrayOf<Figures>(Rectangle(10.0, 20.0), Cercle(Point(5.0, -15.0), 20.0) : le precent code fait appel à l'inference de type for (currentFigure in allFigures) { when (currentFigure) { is Rectangle -> println("Mon permimetre est de ${currentFigure.perimetre()}") is Cercle -> println("Mon aire est de ${currentFigure.aire()}") } } |
- La boucle for est simplifiée par rapport au Java : écrire "for (valeur: Int = 0; valeur < 10; valeur++)" ou tout code de ce genre est totalement interdit en Kotlin. Il faut obligatoirement passer par un itérateur !
- On teste dans chaque branche de when à l'aide du mot clé if, et on ne met ni point-virgule, ni virgule ... rien en fin de ligne de chaque branche !!!
- Ici je crée une TemplateString : dès que le compilateur verra $a dans la chaîne "Voici a : $a", il remplacera la chaîne "$a" par la valeur de a. Par contre si l'on doit utiliser une expression, il faut l'englober dans des accolades, comme dans le code.
- Enfin, l'aspect le plus inattendu, le SmartCast. Une fois que le compilateur voit is Rectangle, c'est comme si il avait aussitôt transformé lui-même la variable currentFigure en instance de Rectangle, de sorte que la méthode perimetre() peut être directement appellée. Mais attention, cela ne vaut que pour cette branche-ci ! De même pour la branche is Cercle.
Voilà ! En espérant ne pas trop vous avoir noyé et que vous avez pris du plaisir à lire ce billet !