Aller plus loin avec les classes
Les éléments statiques
En Kotlin, les classes peuvent porter deux éléments statiques : des méthodes et des attributs.
1. Les méthodes statiques
a. Qu’est-ce qu’une méthode statique ?
Une méthode statique est une méthode qui appartient à une classe, mais pas aux objets instanciés de cette classe. Cela signifie qu’une méthode statique s’écrit dans la classe, mais peut s’utiliser sans avoir besoin d’instancier un objet. Puisque, contrairement à une méthode traditionnelle, une méthode statique n’appartient pas aux objets instanciés d’une classe, les attributs de la classes ne sont donc pas accessibles depuis la méthode statique.
b. Écrire une méthode statique
Du point de vue de la syntaxe, une méthode statique n’est pas différente d’une méthode "classique". La seule subtilité est qu’on ne peut pas l’écrire n’importe où. Il convient de l’écrire dans un companion object.
Un companion object doit être déclaré dans une classe de la façon suivante :
class Dog(age: Int, name: String, race: String, color: String,
size: Int, weight: Float, var position: Char = 't')
: Animal(age, name, race, color, size, weight)
{
companion object
{
}
private fun bark()
{
println("woof! Woof!")
}
}
Le companion object doit être déclaré dans la classe, mais son emplacement n’est pas imposé. Ici, il est placé avant les méthodes classiques de la classe, mais il est tout à...
Les extensions
L’héritage permet d’étendre les possibilités d’une classe. Nous allons voir une autre façon d’ajouter des fonctionnalités à une classe à travers ce qu’on appelle les extensions.
1. Les limites de l’héritage
L’héritage est un concept formidable de la programmation orientée objet. C’est aussi un concept qui se prévoit.
En effet, si l’on souhaite permettre l’héritage d’une classe, il est nécessaire d’explicitement l’indiquer en utilisant le mot-clé open.
Un programme est rarement le fruit d’un seul développeur. Nous sommes rarement l’auteur de 100 % du code. Il est par exemple extrêmement commun de consommer des bibliothèques tierces dont le but est de faire gagner du temps en implémentant de la logique métier compliquée, une interaction via un protocole spécifique, etc.
Il existe des milliers de bibliothèques intégrables dans un projet. Certaines sont gratuites, d’autres non. Certaines sont open source, d’autres non. JetBrains propose par exemple Ktor, une bibliothèque open source, utilisable gratuitement, qui permet de faire des requêtes HTTP.
Il n’est pas rare de vouloir étendre les possibilités d’une bibliothèque que l’on utilise sans pour autant l’avoir développée. Imaginons qu’une bibliothèque modélisant de nombreux animaux est disponible, nous évitant de les modéliser de notre côté, et qu’elle contient...
Les alias
1. Qu’est-ce qu’un alias ?
Un alias permet de renommer des types existants pour une utilisation simplifiée. Il s’agit ici d’un pur concept de confort qui n’a d’autre objectif que de rendre l’écriture et la lecture d’un code source plus simple.
Pourquoi vouloir renommer un type ?
Imaginons un programme dans lequel une classe contient une classe qui elle-même contient une classe, etc. :
class Animal
{
class Dog
{
class Labrador
}
}
Pour instancier la classe Labrador, nous sommes obligés d’inscrire le chemin complet de la classe (ou alors d’ajouter l’instruction import Animal.Dog.*) :
val doggo = Animal.Dog.Labrador()
Cette ligne de code est fastidieuse à écrire. Grâce au concept d’alias, nous pouvons la simplifier.
2. Créer un alias
Écrire un alias est très simple puisqu’il suffit d’utiliser le mot-clé typealias suivi du nom de l’alias et de lui affecter le type original grâce à l’opérateur =.
Créons un alias du nom de Doggo pour remplacer l’écriture Animal.Dog.Labrador :
typealias Doggo = Animal.Dog.Labrador
Il est ensuite possible de remplacer l’écriture Animal.Dog.Labrador() par Doggo() :
val doggo...
En résumé
-
Une méthode statique est une méthode qui appartient à une classe et qui peut donc être appelée directement sans avoir besoin de créer d’objet.
-
Un attribut statique est un attribut qui appartient à une classe et qui peut donc être appelé directement sans avoir besoin de créer d’objet.
-
Il est possible d’étendre les capacités d’une classe, sans passer par l’héritage, en lui ajoutant une méthode d’extension ou des attributs d’extensions.
-
Une méthode d’extension ne peut accéder qu’aux attributs public de la classe.
-
Un attribut d’extension est obligatoirement en lecture seule, ne peut pas être initialisé et doit renvoyer une valeur à travers son accesseur.
-
Les méthodes et attributs d’extension sont à privilégier par rapport à l’héritage uniquement quand celui-ci n’est pas possible pour des raisons techniques.
-
Les alias permettent de donner un nom alternatif à un type existant afin d’en faciliter l’usage.