L'héritage
Classes parents et enfants
L'héritage de classe permet d'obtenir des classes plus spécialisées, tout en gardant les propriétés et les méthodes de la classe parent.
classDiagram
Animal <|-- Chien
Animal <|-- Chat
class Animal {
String nom
String espece
Animal(nom, espece)
marcher()
}
class Chien {
String surnom
bool estPurRace
Chien(nom, purRace)
jappe()
}
class Chat {
int viesRestantes
Chat(nom)
miaule()
}
Ainsi, tous les animaux doivent avoir un nom et une espèce (seul constructeur disponible) et peuvent marcher. Pour instancier un chat, pas besoin d'avoir l'espèce, mais un nom est important. Il possède aussi un nombre de vies restantes, ce que les animaux n'ont pas. Le principe est similaire pour les chiens.
Polymorphisme
Le polymorphisme consiste à utiliser des méthodes communes à une classe de base (ou à une interface). Imaginons les animaux suivants, dans chacun leur liste, et que nous voulions les faire marcher :
// Une liste de chiens
ArrayList<Chien> listeChiens = new ArrayList<>();
listeChiens.add(new Chien("Fido", true));
listeChiens.add(new Chien("Toto", false));
// Une liste de chats, syntaxe différente
ArrayList<Chat> listeChats = new ArrayList<>() {
{
add(new Chat("Minet"));
add(new Chat("Muffin"));
}
};
// Faire marcher les chiens et les chats
for (Chien chien : listeChiens) {
chien.marche();
}
for (Chat chat : listeChats) {
chat.marche();
}
On voit rapidement que ce n'est pas l'idéal. À la place, étant donné que les chiens et les chats sont des sous-classes de Animal
, il serait possible d'utiliser cette classe principale pour faire marcher tous les animaux :
ArrayList<Animal> listeAnimaux = new ArrayList<>() {
{
add(new Chien("Fido", true));
add(new Chien("Toto", false));
add(new Chat("Minet"));
add(new Chat("Muffin"));
}
};
for (Animal animal : listeAnimaux) {
animal.marche();
}
On pourrait également faire japper seulement les chiens contenus dans la liste en vérifiant si la variable est une instance de chien :