Surchage, héritage et polymorphisme - Java - Programmation
Marsh Posté le 04-08-2005 à 01:00:32
Encore moi,
Je travaille sur cet exercice, est-ce que je suis sur la bonne voie?
Je vais enregistré cet exercice sous le nom : Véhicules
Classe : véhicule
Sous-classes : camion, auto
Je dois enregistré véhicule, camion et auto avec leur caractéristiques (couleur, année, usagée, neuve) dans des fichiers différents et joindre le tout dans un même fichier en effectuant la surchage, l'héritage et le polymorphisme??
Est-ce que quelqun peut m'aider s.v.p.
Merci.
Marsh Posté le 04-08-2005 à 01:08:25
ben ta classe véhicule, tu la mets abstraite je pense, et tu dérives camion, auto, etc
Marsh Posté le 04-08-2005 à 12:36:13
Bon, c'est bien bien parti.
Remarque : je ne vois pas l'intéret de déclarer la classe véhicule comme abstraite !!
Pour l'héritage, tu as tout compris : auto et camion héritent de véhicule.
Pour la surcharge : écris par exemple une méthode "affiche()" qui écrira à l'écran les états de ta classe ( ex pour véhicule : "année", et pour camion "année" + "typeDeChargement" ). En fait on dit que l'on surcharge la méthode "affiche" car elle est utilisée ( même nom ) pour deux classes différentes.
Pour le polymorphisme, crée un tableau de 2 éléments ( ça suffira ) de type "vehicule" ( code : vehicule [] monTableau=new Vehicule[2]; ) où tu mettras une instance de "véhicule" et une instance de "camion". Ensuite appèle la méthode "affiche()" pour chaque élément du tableau. Regarde le résultat et tu comprendras ce qu'on appelle polymorphisme.
Bon courage
Marsh Posté le 04-08-2005 à 12:49:29
Tu déclares Vehicule abstraite car elle contient certainement des méthodes abstraites, qui ne sont implémentées que par ces descendants Camion, Auto.
Instancier un Vehicule n'aurait pas de sens. Tu mélangerais sur ta route Camion, Auto et Vehicule. Ca ne va pas. Tu peux instancier Camion et Auto, ça ne choque pas, et les manipuler comme des Vehicule. Mais instancer en plus un Vehicule, heuuuu....
Marsh Posté le 04-08-2005 à 13:08:10
En effet, tout est discutable selon la nature du projet. Mais notre élève connait-il déjà la notion d'abstraction ? ( je connais par son livre ainsi que l'ordre des chapitres )... enfin je disais ça, c'était pour éviter de l'embrouiller avec plein de noms compliqués d'un coup.
Marsh Posté le 04-08-2005 à 13:13:21
il est temps que je l'écrive ce tuto je crois
globalement : un problème s'analyse par rapport à un besoin, il y a de fortes chances que dans un bon paquets de problèmes, les bagnoles et les camions soient des instances de la même classe.
Désolé, mais la plupart des objets qui existent dans un programme ne modélisent pas directement des choses de la vraie vie.
Marsh Posté le 04-08-2005 à 13:13:52
Vrai, mais mieux vaut prendre de bonnes habitudes dès le départ. Utiliser des analogies avec la vie réelle est par ailleurs à double tranchant.
Je m'explique. On parle de propriétés et de méthodes, ces dernières reflétant des comportements. Or, comment fait-on la plupart du temps ? Les "comportements" sont implémentés sur des "managers", ne laissant que les propriétés pour modéliser l'objet. POJO power.
Grosse arnaque des bouquins O.O., restés sur la bonne vieille O.O. sans tenir compte de design patterns devenus une habitude.
Marsh Posté le 04-08-2005 à 13:20:36
sircam a écrit : Les "comportements" sont implémentés sur des "managers", ne laissant que les propriétés pour modéliser l'objet. POJO power. |
c'est de la stratégie, ce n'est normalement pas pour des comportements intrinsèques.
typiquement, si tu fais de la simulation géométrique de bagnoles, les déplacement seronts effectués de l'extérieur, car tout déplacement possède des contraites physiques impliquant les autres bagnoles et l'environnement. Par contre, la consomation ou l'allumage des feux sont plutôt des opérations intrinsèques.
Marsh Posté le 04-08-2005 à 13:46:14
http://www.objectmentor.com/resour [...] eMaker.pdf
tiens, ça c'est pas mal, on vient bien qu'à la fin ce ne sont pas des objets de la vraie vie qui restent dans le desing.
Marsh Posté le 04-08-2005 à 14:19:01
Mouais, je ne vois plus guère d'opérations intrinsèques dans les applis typiques commerce/finance ces jours-ci.
J'aime pourtant bien faire myCar.getFuelUsage();
Mais dans les bouquins, je n'ai jamais vu une telle différence. On parle de méthode et c'est tout, et les exemples "vie courante" tombent souvent à plat.
Pas évident pour les débutants.
Marsh Posté le 06-08-2005 à 18:37:51
Bon ok alors je suis encore un peu mélangée!
Est-ce qu'il y a des bons exemples sur le web en Francais?
Merci de votre aide.
Je vais essayer de travailler là-dessus et je vous reviens plus tard.
Marsh Posté le 06-08-2005 à 22:48:02
Bonjour,
Alors voici ce que j'ai fait. J'ai défini une classe, fait l'héritage et le polymorphisme. Par contre, que dois-je ajouter pour ajouter une surchage??
J'ai aussi un message qui dit que j'ai deux erreurs??
Quelqun peut m'aider s.v.p.
Mon code :
class Vehicule
{
// définition des attributs
String marque;
fonctionnement;
caracteristique;
// Constructeur
Vehicule(String saMarque,String sonFonctionnement,String saCaracteristique)
{
marque=saMarque;
fonctionnement=sonFonctionnement;
caracteristique=SaCaracteristique;
}
// définition des méthodes
void getInformation()
{
System.out.println("" );
System.out.println("Information sur les véhicules:" );
System.out.println("Marque:" + marque);
System.out.println("Fonctionnement:" + fonctionnement);
System.out.println("Caracteristique:" + caracteristique);
}
} // fin de la classe Vehicule
class Camion extends Vehicule
{
// définition des attributs
String vitesse;
// Constructeur
Camion(String saMarque,String sonFonctionnement,String saCaracteristique,String saVitesse)
{
// Appel du constructeur de la classe de base: Vehicule
super(saMarque,sonFonctionnement,saCarateristique);
vitesse=saVitesse;
}
// définition des méthodes
void getInformation()
{
System.out.println("" );
System.out.println("Information sur le camion:" );
System.out.println("Marque:" + marque);
System.out.println("Fonctionnement:" + fonctionnement);
System.out.println("Caracteristique:" + caracteristique);
System.out.println("Vitesse:" + vitesse);
System.out.println("" );
}
} // fin de la classe Camion
class Avion extends Vehicule
{
// définition des attributs
String hauteur;
// Constructeur
Avion(String saMarque,String sonFonctionnement,String saCaracteristique,String saHauteur)
{
// Appel du constructeur de la classe de base: Vehicule
super(saMarque,sonFonctionnement,saCarateristique);
hauteur=saHauteur;
}
// définition des méthodes
void getInformation()
{
System.out.println("" );
System.out.println("Information sur l'avion:" );
System.out.println("Marque:" + marque);
System.out.println("Fonctionnement:" + fonctionnement);
System.out.println("Caracteristique:" + caracteristique);
System.out.println("Hauteur:" + hauteur);
System.out.println("" );
}
} // fin de la classe Avion
public class Information
{
public static void main(String[] args)
{
// tonVehicule va faire référence à un objet de type Camion
// monVehicule va faire référence à un objet de type Avion
Vehicule monVehicule;
Vehicule tonVehicule=new Vehicule ("Ford","Roule","Transporteur", 200);
tonVehicule.getInformation();
monVehicule = new Camion ("Airbus","Vole","Transporteur", 40000);
monVehicule.getInformation();
}
}
Marsh Posté le 06-08-2005 à 23:04:04
1/ balise [code]
2/ revoi ce qu'est le polymorphisme
Marsh Posté le 06-08-2005 à 23:22:32
Kangol : qu'est-ce que je dois corriger?
Je suis débutante.
Marsh Posté le 06-08-2005 à 23:24:14
rien, t'appelle une fonction getmachin, seulement elle retourne void, donc elle get rien du tout
Marsh Posté le 06-08-2005 à 23:25:37
hum.........je suis désolée.......si je ne comprends pas! hehe alors je dois ajouter Void getInformation() en quelque part pour qu'elle le "get" comme tu dis?
Marsh Posté le 06-08-2005 à 23:40:32
tachag a écrit : hum.........je suis désolée.......si je ne comprends pas! hehe alors je dois ajouter Void getInformation() en quelque part pour qu'elle le "get" comme tu dis? |
ce qu'il veut dire, c'est que vu son nom, ta fonction semble retourner une info ! or, son type de retour est void, ce qui veut dire qu'elle ne retourne rien du tout
Marsh Posté le 06-08-2005 à 23:47:41
Ok alors je devrais l'enlever? Je suis sincèrement désolée je suis débutante et j'essaie de comprendre. Que dois-je modifier dans mon code?
Est-ce trop compliqué? Ou bien, peux-tu me donner un exemple, semblable au mien qui comporte une classe, une surcharge, héritage et polymorphisme?
Merci beaucoup.
Marsh Posté le 06-08-2005 à 23:57:44
tachag a écrit : Ok alors je devrais l'enlever? Je suis sincèrement désolée je suis débutante et j'essaie de comprendre. Que dois-je modifier dans mon code? |
je vais pas te donner d'exemple, mais des pistes :
- ta classe Vehicule étant une classe abstraite, elle ne doit implémenter aucune méthode.
- comme dit KangOl, revoit le polymorphisme : ta fonction getInformation() est sensée renvoyer des infos différentes en fonction du véhicule (une voiture n'a pas le même nombre de roues qu'un camion par exemple)
- tu dois donc redéfinir cette fonction dans chaque classe qui héritera de véhicule, et déclarer cette fonction comme virtuelle
- ...
Marsh Posté le 07-08-2005 à 00:02:10
euh non c'est pas ca que je voulais dire par revoir ce qu'etait le polymorphisme...
le polymorphisme, c'est plusieur méthodes qui portent le meme nom mais ont des paramètres différents
le fait de redéfinir une méthode dans une classe fille c'est un surchage
Marsh Posté le 07-08-2005 à 00:04:19
KangOl a écrit : euh non c'est pas ca que je voulais dire par revoir ce qu'etait le polymorphisme... |
edit: t'as pas l'impression de te mélanger là ?
Marsh Posté le 07-08-2005 à 00:04:56
ok je vois.
Surcharge, comment redéfinir une méthode?
je ne sais pas comment faire mon code?
Dois-je tout recommencer?
Marsh Posté le 07-08-2005 à 00:05:54
hehehe je suis toute mélangée!
Dois-je prendre un exemple d'animaux au lieu?
Marsh Posté le 07-08-2005 à 00:07:49
ben il est bon ton code. On discutait juste sur le mauvais nom de ta fonction. Quand tu lances ton programmes, tu vois bien que c'est la méthode du vrai type de l'objet qui est appelée
Marsh Posté le 07-08-2005 à 00:11:30
OK tout fonctionne!!!
Voici le code :
class Vehicule
{
// définition des attributs
protected String marque;
protected String fonctionnement;
// Constructeur
Vehicule(String saMarque,String sonFonctionnement)
{
marque=saMarque;
fonctionnement=sonFonctionnement;
}
// définition des méthodes
void getInformation()
{
System.out.println("" );
System.out.println("Information sur les véhicules:" );
System.out.println("Marque:" + marque);
System.out.println("Fonctionnement:" + fonctionnement);
}
}
// fin de la classe Vehicule
class Camion extends Vehicule
{
// définition des attributs
String vitesse;
// Constructeur
Camion(String saMarque,String sonFonctionnement,String saVitesse)
{
// Appel du constructeur de la classe de base: Vehicule
super(saMarque,sonFonctionnement);
vitesse=saVitesse;
}
// définition des méthodes
void getInformation()
{
System.out.println("" );
System.out.println("Information sur le camion:" );
System.out.println("Marque:" + marque);
System.out.println("Fonctionnement:" + fonctionnement);
System.out.println("Vitesse:" + vitesse);
System.out.println("" );
}
} // fin de la classe Camion
class Avion extends Vehicule
{
// définition des attributs
String hauteur;
// Constructeur
Avion(String saMarque,String sonFonctionnement,String saHauteur)
{
// Appel du constructeur de la classe de base: Vehicule
super(saMarque,sonFonctionnement);
hauteur=saHauteur;
}
// définition des méthodes
void getInformation()
{
System.out.println("" );
System.out.println("Information sur l'avion:" );
System.out.println("Marque:" + marque);
System.out.println("Fonctionnement:" + fonctionnement);
System.out.println("Hauteur:" + hauteur);
System.out.println("" );
}
} // fin de la classe Avion
public class Information
{
public static void main(String[] args)
{
// tonVehicule va faire référence à un objet de type Camion
// monVehicule va faire référence à un objet de type Avion
Vehicule monVehicule;
Vehicule tonVehicule=new Camion ("Ford","Roule","200 km/h" );
tonVehicule.getInformation();
monVehicule=new Avion ("Airbus","Vole","40000 pieds" );
monVehicule.getInformation();
}
}
Marsh Posté le 07-08-2005 à 00:13:47
à quoi sert il d'implémenter getInformation() dans Vehicule, vu que cette classe ne sera jamais instanciée
Marsh Posté le 07-08-2005 à 00:15:23
ok alors selon toi, je peux enlever, dans la classe Vehicule, cette information? Je me suis inspirée d'un modèle dans mon livre.
Maintenant, comment ajouter une surcharge?
Marsh Posté le 07-08-2005 à 01:28:42
KangOl>
tachag> si tu veux tester la surcharge rajoute juste dans ta classe avion par exemple une deuxième méthode getInformation mais qui prend un paramètre cette fois çi. Tu te retrouveras donc avec 2 méthodes getInformation ayant une signature différente dans une même classe. Mais bon ça devrait apparaître dans ton livre des choses aussi triviales.
Marsh Posté le 07-08-2005 à 11:02:35
Harkonnen a écrit : |
bon a priori y a les deux...
http://fr.wikipedia.org/wiki/Polymorphisme
meme si le coup des classes c'est pas vraiment du polymorphisme...
Citation : un mot hérité du grec signifiant "capacité d'assumer plusieurs formes". |
ca c'est bien le coup d'un meme methode avec plusieurs formes possible. si elles sont dans des classes dérivées, c'est une redéfinition
Marsh Posté le 07-08-2005 à 11:04:18
ReplyMarsh Posté le 07-08-2005 à 15:44:59
un mot hérité du grec signifiant "capacité d'assumer plusieurs formes".
En OO ça se rapporte aux objets... un objet peut se faire passer pour un autre tout en gardant les méthodes qu'il aurait rédéfini, rien avoir avec une méthode qu'on surcharge.
Marsh Posté le 07-08-2005 à 15:57:42
eventuellement...
Marsh Posté le 07-08-2005 à 16:28:13
Bon......je suis toute mélangée.!!!! hehehe
Il n'y aurait pas un exemple de code avec une surcharge et un sans surcharge? Peut-être que je comprendrais mieux.
Merci.
Marsh Posté le 09-08-2005 à 10:31:44
Désolé, j'ai appuyé sur le mauvais bouton ... ;-)
Code :
|
pour surcharger la méthode affiche, il te suffit de rajouter par exemple :
Code :
|
la méthode qui se nomme "afficher" est ainsi surchargée car elle comporte deux signature : une avec un entier en paramètre, et une deuxième avec une chaine de caractères en paramètre.
C'est aussi simple que ça.
Marsh Posté le 10-08-2005 à 01:18:58
ha ok!
Je pense avoir compris. J'ai posté mon code avec une surcharge dans un nouveau message par erreur. Vous pouvez allez lire le sujet : Surcharge aide
Marsh Posté le 10-08-2005 à 02:10:58
Ok voici mon message :
Bonjour,
Alors, j'ai essayé de faire une surcharge.
Ma question est : pourquoi lorsque je fais execute file, l'information n'apparaît pas?
Je vous transmets seulement le code d'une classe :
class Camion extends Vehicule
{
// définition des attributs
String vitesse;
String couleur;
// Constructeur
Camion(String saMarque,String sonFonctionnement,String saVitesse, String laCouleur)
{
// Appel du constructeur de la classe de base: Vehicule
super(saMarque,sonFonctionnement);
vitesse=saVitesse;
}
// définition des méthodes
void getInformation()
{
System.out.println("" );
System.out.println("Information sur le camion:" );
System.out.println("Marque:" + marque);
System.out.println("Fonctionnement:" + fonctionnement);
System.out.println("Vitesse:" + vitesse);
System.out.println("" );
}
// Surcharge : Permet de définir dans la même classe plusieurs méthodes.
void getInformation(String laCouleur)
{
System.out.println("" );
System.out.println("Information sur la couleur du camion:" );
System.out.println("Couleur:" + couleur);
System.out.println("" );
}
} // fin de la classe Camion
Marsh Posté le 03-08-2005 à 22:48:01
Bonjour!
Bon alors je continue d'étudier mon beau petit livre de Java. J'ai un petit exercice et il mentionne de faire un fichier contenant les notions de classe et surcharge et un fichier contenant la notion de l'héritage et finalement un fichier contenant 'main' et exploiter les deux classes de façon à introduire le polymorphisme???
Compliqué? Avez-vous une idée avec quel exemple je pourrais ESSAYER de faire ca! Avec des voitures? Livres?
Je dois relire quelques pages hahaha!!!
Merci de votre aide!