Pb : Classe abstraite vs Classe instanciable
Fermé
A.sissou
Messages postés
1
Date d'inscription
lundi 11 mars 2019
Statut
Membre
Dernière intervention
11 mars 2019
-
11 mars 2019 à 11:05
Utilisateur anonyme - 11 mars 2019 à 19:29
Utilisateur anonyme - 11 mars 2019 à 19:29
2 réponses
Utilisateur anonyme
11 mars 2019 à 18:11
11 mars 2019 à 18:11
Bonjour
je ne code pas en Java, donc je ne vais parler que de principes généraux et pas de leurs applications dans ce langage.
Si quelqu'un t'avais répondu, je me serais abstenu, mais faut croire qu'il n'y a personne aujourd'hui.
Le principe du polymorphisme est qu'un objet est du type avec lequel il a été défini, mais aussi de tous les types dont il hérite.
On pourrait imaginer que tu as la classe abstraite Animal, en classes mères tu as les classes abstraites Mammifère, Reptile, Oiseau, Poisson, etc.... Dérivant de Mammifère et toujours abstrait tu pourrais avoir Ovin, Bovin, Equin, Canide etc... et enfin dérivant de Canide tu aurais, Chien, Loup etc...
Et bien un Chien, est aussi un Canide, un Mamifère et un Animal.
Et cela "marche" dans l'autre sens, c'est à dire qu'un Chien, un Loup, une Carpe, un Oie et un Lézard sont tous des Animaux.
Donc dans une collection d'Animaux, tu peux les ranger par région.
Pour accéder aux membres communs y'a pas de soucis
Et pour utiliser un membre spécifique au type, il faut caster l'instance dans le type final.
En C# ça donnerait
Java est C# sont assez proche. Non seulement je suis certain qu'on peut faire la même chose en Java, mais si ça se trouve c'est la même syntaxe.
je ne code pas en Java, donc je ne vais parler que de principes généraux et pas de leurs applications dans ce langage.
Si quelqu'un t'avais répondu, je me serais abstenu, mais faut croire qu'il n'y a personne aujourd'hui.
Le principe du polymorphisme est qu'un objet est du type avec lequel il a été défini, mais aussi de tous les types dont il hérite.
On pourrait imaginer que tu as la classe abstraite Animal, en classes mères tu as les classes abstraites Mammifère, Reptile, Oiseau, Poisson, etc.... Dérivant de Mammifère et toujours abstrait tu pourrais avoir Ovin, Bovin, Equin, Canide etc... et enfin dérivant de Canide tu aurais, Chien, Loup etc...
Et bien un Chien, est aussi un Canide, un Mamifère et un Animal.
Et cela "marche" dans l'autre sens, c'est à dire qu'un Chien, un Loup, une Carpe, un Oie et un Lézard sont tous des Animaux.
Donc dans une collection d'Animaux, tu peux les ranger par région.
Pour accéder aux membres communs y'a pas de soucis
Animaux[i].Crier();retournera
"Le chien aboie"si l'item i de la collection est un chien, et
"bloup bloup"si c'est une carpe.
Et pour utiliser un membre spécifique au type, il faut caster l'instance dans le type final.
En C# ça donnerait
if(Animaux[i] is Chien)//on détermine si l'item i est un chien { ((Chien)Animaux[i]).MarquerTerritoire(); //si c'est le cas on caste pour utiliser la méthode spécifique }
Java est C# sont assez proche. Non seulement je suis certain qu'on peut faire la même chose en Java, mais si ça se trouve c'est la même syntaxe.
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
11 mars 2019 à 18:23
11 mars 2019 à 18:23
Bonjour,
PB : je ne peux pas instancier cette liste par une liste d'objets Animal étant donné que la classe Animal est abstraite...
Si tu peux tout à fait, on appelle ça le polymorphisme :
"je n'arrive pas à parcourir une liste animaux_par_Region sans perdre l'information sur la sous classe"
Tu peux créer une méthode dans la classe Animal qui te renvoie de quelle espèce est chaque animal :
Remarque : d'un point de vue purement mécanique on peut aussi utiliser la méthode getClass de Object
PB : je ne peux pas instancier cette liste par une liste d'objets Animal étant donné que la classe Animal est abstraite...
Si tu peux tout à fait, on appelle ça le polymorphisme :
List<Animal> animaux = Arrays.asList(chat, chien);
"je n'arrive pas à parcourir une liste animaux_par_Region sans perdre l'information sur la sous classe"
Tu peux créer une méthode dans la classe Animal qui te renvoie de quelle espèce est chaque animal :
for (Animal animal : animaux) { System.out.println("Le " + animal.espece() + " " + animal.cri()); }
Remarque : d'un point de vue purement mécanique on peut aussi utiliser la méthode getClass de Object
KX
Messages postés
16754
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
25 novembre 2024
3 020
>
Utilisateur anonyme
11 mars 2019 à 19:14
11 mars 2019 à 19:14
Oups, je n'avais pas vu ta réponse, ça a du se croiser...
En Java tu peux bien sûr faire pareil :
En Java tu peux bien sûr faire pareil :
if (animaux[i] instanceof Chien) { ((Chien) animaux[i]).marquerTerritoire(); }