US

Projet 5 : Écrire des classes

Ce projet tourne autour de l'écriture de classes et de méthodes, comment écrire une classe ? Comment utiliser une classe ? Il est important de voir la différence entre classes et objets, ces derniers étant des instances d'une classe.

Le problème

On a envie de simuler une course automobile, on va donc devoir manipuler des voitures. On a diverses informations sur la voiture : sa position, sa vitesse et son accélération. Que peut-t'on faire avec une voiture ? On peut connaitre sa position et on peut la mettre à jour.

Définir les classes

Comme d'habitude, commencez par créer un nouveau projet dans Eclipse, on le nommera Projet5. Une fois le projet créé, on doit décider quelles sont les classes dont on va avoir besoin et les relations qui vont exister entre ces classes. On aura comme toujours une classe avec la méthode main qui sera le point d'entrée du programme, on peut donc créer une classe Projet5 avec une méthode main.

Ensuite, on doit pouvoir représenter la position, vitesse et accélération des voitures, on va donc créer une classe qui représente un vecteur dans le plan (on suppose que les voitures se déplacent dans un plan), la classe Vector2D. Enfin, il nous reste une dernière classe à faire, la classe Car qui représente une voiture.

Une fois ces trois classes créées, vous devriez les voir dans l'explorateur de package dans la partie gauche d'Eclipse. Cet onglet est très utile pour naviguer facilement parmi toutes les classes d'un projet.

Explorateur de package
fig j1 Explorateur de package

On a donc deux classes à écrire : la classe Vector2D qui représente un vecteur dans le plan et la classe Car qui représente une voiture.

La classe Vector2D

Que retrouve-t'on dans une classe ? On a des variables d'instance, des constructeurs et des méthodes.

Variables d'instance

Commençons par les variables d'instance, il faut se poser la question, qu'est-ce-qu'un vecteur dans le plan, comment le caractériser ? Un vecteur dans le plan, c'est en fait deux coordonnées réelles, une abscisse et une ordonnée, on va donc mettre deux variables d'instance dans la classe.

1 
private double x, y;
listing j1 Variables d'instance de la classe Vector2D

On déclare donc deux variables d'instance de type double dont les noms sont x et y (vous vous rappelez que l'on peut déclarer plusieurs variables du même type en les énumérant séparés par des virgules), et les deux variables sont déclarées comme private, on met toujours private quand on ne sait pas quoi mettre.

Constructeur

La seconde chose à faire lorsqu'on écrit une classe est de définir le constructeur. Le constructeur est une méthode spéciale qui permet de construire l'objet. La signature du constructeur commence toujours par public suivi du nom de la classe. Ensuite, on met entre parenthèses la liste des paramètres. Pour savoir quels paramètres ont doit mettre, il faut se poser la question Comment je vais faire pour créer un objet de type Vector2D ?.

1 
2 
// Création du vecteur (7.5, 9.1)
Vector2D myVector = new Vector2D (7.5, 9.1);
listing j2 Création d'un objet Vector2D

On voit donc qu'on pourrait vouloir créer un nouveau vecteur en fournissant les coordonnées en x et en y du vecteur. On fournit deux nombres réels, donc, le constructeur de la classe Vector2D doit prendre deux paramètres de type double. On a donc la signature du constructeur.

1 
2 
3 
public Vector2D (double coordX, double coordY)
{
}
listing j3 Signature du constructeur de la classe Vector2D

Il ne nous reste plus qu'à compléter le corps du constructeur. Que doit-t'on y mettre ? Il faut tout d'abord initialiser toutes les variables d'instance et puis, on peut y faire d'autres choses. Donc, on doit donner une valeur aux deux variables d'instance x et y. On va simplement leur donner la valeur qu'on a reçu en paramètre.

1 
2 
3 
4 
5 
public Vector2D (double coordX, double coordY)
{
    x = coordX;
    y = coordY;
}
listing j4 Constructeur de la classe Vector2D

Méthodes

Il ne reste plus qu'à ajouter des méthodes à la classe. On va par exemple ajouter une méthode pour récupérer la première coordonnée du vecteur et une méthode pour la seconde coordonnée du vecteur. Voyons pour récupérer la première coordonnée.

1 
2 
3 
4 
public double getX()
{
    return x;
}
listing j5 Méthode getX de la classe Vector2D

Il y a deux types de méthodes en Java. Le premier type de méthode fait certaines opérations et c'est tout, tandis que le second type de méthodes en plus renvoie une valeur. La signature d'une méthode commence par public puis on retrouve soit void pour le premier type de méthode ou alors un type de variable pour le second type de méthode.

Notre méthode doit renvoyer une valeur de type double, donc sa signature commence par public double, ensuite on a le nom de la méthode qui est chez nous getX et enfin la liste de paramètres entre parenthèses mais notre méthode n'a pas besoin de paramètres.

Son corps est assez simple, on renvoie simplement la valeur contenue dans la variable d'instance x. Ce genre de méthodes qui se contentent de renvoyer la valeur d'une variable d'instance sont appelées getter et avec Eclipse, on peut les générer facilement. Faites bouton droit sur le code source de la classe, puis cliquez sur le menu Source > Generate Getters and Setters.

Générer les getters et les setters
fig j2 Générer les getters et les setters

Maintenant que la classe Vector2D est complètement écrite, on peut la tester. C'est une bonne pratique que de tester chaque nouvelle classe que l'on écrit.

1 
2 
3 
4 
5 
6 
7 
8 
9 
// Création du vecteur (7.5, 9.1)
Vector2D myVector = new Vector2D (7.5, 9.1);
 
// On récupère les coordonnées du vecteur
double x = myVector.getX();
double y = myVector.getY();
 
// On affiche les coordonnées du vecteur
System.out.printf ("Coordonnées du vecteur x=%.2f et y=%.2f", x, y);
listing j6 Test de la classe Vector2D

L'exécution de ce programme va afficher à la console

Coordonnées du vecteur x=7,50 et y=9,10

La classe Car

On suit à nouveau le même raisonnement, on commence par les variables d'instance, il nous en faut trois, une pour la position, une pour la vitesse et enfin une dernière pour l'accélération. Ce seront des variables de type Vector2D.

1 
private Vector2D position, speed, acceleration;
listing j7 Variables d'instance de la classe Car

Maintenant, un constructeur. Supposons que l'on construise une voiture sans fournir aucun paramètre et que la voiture se trouve initialement à la position (0,0) avec une vitesse de (1,0) et une accélération de (0,0). Le constructeur ne prend donc aucun paramètre et doit initialiser toutes les variables d'instance, ici comme ce sont des objets, on va devoir créer des nouveaux objets avec new.

1 
2 
3 
4 
5 
6 
public Car()
{
    position = new Vector2D (0, 0);
    speed = new Vector2D (1, 0);
    acceleration = new Vector2D (0, 0);
}
listing j8 Constructeur de la classe Car

Mise à jour de la position

On peut ajouter à la classe Car une méthode qui permet de récupérer la position de la voiture, on le fait manuellement ou alors automatiquement avec Eclipse puisqu'il s'agit en fait d'un getter. Enfin, on a dit qu'on voulait une méthode pour mettre à jour la position de la voiture. C'est une méthode qui fait quelque chose mais ne doit rien renvoyer, on le signale avec void dans la signature, de plus la méthode ne prend aucun paramètres.

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
public void updatePos()
{
    // Position actuelle
    double x = position.getX();
    double y = position.getY();
 
    // On met à jour la position
    position = new Vector2D (x + speed.getX(), y + speed.getY());
 
    // Vitesse actuelle
    x = speed.getX();
    y = speed.getY();
 
    // On met à jour la vitesse
    speed = new Vector2D (x + acceleration.getX(), y + acceleration.getY());
}
listing j9 Mise à jour de la position dans la classe Car

La mise à jour est assez simple, tout d'abord, on récupère les coordonnées x et y de la position et puis on crée un nouveau vecteur que l'on met dans la variable position. La nouvelle position en x est l'ancienne position en x augmentée de la valeur de la vitesse en x. On fait pareil pour les y. Ensuite, on met à jour la vitesse en fonction de l'accélération d'une manière similaire.

Test

Faisons un test de tout ça alors. On créé une nouvelle voiture, on affiche la position de la voiture, puis on fait une mise à jour et on réaffiche sa position. Normalement, la voiture sera tout d'abord en (0,0) et après une mise à jour, elle sera en (1,0).

Attention, n'oubliez pas de d'abord ajouter une méthode getPosition qui permet d'obtenir la position de la voiture dans la classe Car. La signature de la méthode est simplement :

public Vector2D getPosition()

et la méthode doit juste renvoyer la position de la voiture, c'est-à-dire renvoyer la variable d'instance position. Le corps de la méthode contient donc une seule instruction : return position;.

1 
2 
3 
 
4 
5 
6 
7 
8 
 
Car car = new Car();
Vector2D avant = car.getPosition();
System.out.printf ("Avant la voiture est en x=%.2f et y=%.2f\n", avant.getX(), avant.getY());
 
car.updatePos();
 
Vector2D apres = car.getPosition();
System.out.printf ("Après la voiture est en x=%.2f et y=%.2f\n", apres.getX(), apres.getY());
listing j10 Test de la classe Car
Avant la voiture est en x=0,00 et y=0,00
Après la voiture est en x=1,00 et y=0,00

Le test a fonctionné sans problèmes, parfait.

Surcharge

Voyons un dernier point, on a vu que l'on pouvait avoir deux méthodes avec le même nom dans une classe pour autant que la liste des paramètres soit différente. Supposons que l'on souhaite pouvoir créer des nouvelles voitures en donnant en paramètre la vitesse initiale, on va donc devoir écrire un second constructeur. Et on peut le faire puisque la liste des paramètres de ce second constructeur ne sera pas la même que celle du premier constructeur.

1 
2 
3 
4 
5 
6 
public Car (Vector2D initSpeed)
{
    position = new Vector2D (0, 0);
    speed = initSpeed;
    acceleration = new Vector2D (0, 0);
}
listing j11 Second constructeur de la classe Car

On va pouvoir faire un nouveau test en utilisant ce nouveau constructeur, on va par exemple créer une voiture avec une vitesse initiale de (1, 3). On met à jour deux fois la position par exemple et on regarde si on a bien (0,0) avant et (2,6) après. Vous trouverez le test dans l'archive du projet, voici le résultat du test

Avant la voiture est en x=0,00 et y=0,00
Après la voiture est en x=2,00 et y=6,00

Relation has-a

La classe Car utilise la classe Vector2D, en effet, elle a trois variables d'instance de type Vector2D. On a une relation has-a ou uses entre ces deux classes. On dit que Car utilise Vector2D. Pour rappel, on peut représenter cette relation comme illustré sur la figure suivante.

Relation uses
fig j3 Relation uses

Résumé des points importants

  • Les variables d'instance représentent l'état de l'objet ;
  • Les méthodes représentent des fonctionnalités de l'objet ;
  • Dans une classe, on retrouve des variables d'instance, des constructeurs et des méthodes ;
  • On peut retrouver plusieurs méthodes avec le même nom dans une classe pour autant que les types des et/ou nombre de paramètres soient différents ;
  • Si on a une classe A qui a des variables d'instance de type objet de la classe B, on a la relation A uses B.

Vous pouvez télécharger le projet si vous le désirez. Ensuite, vous pouvez poursuivre le tutoriel, faire les exercices ou passer au projet suivant.

Pour tout problème, toute remarque, rendez-vous sur le forum consacré aux exercices pratiques.

  • Espace membre
  • Learning Center
  • Les forums
  • Livre d'or
  • Imprimer
  • Boutique
  • Info
  • Règlement
  • Erreur
  • Newsletter

MyPagerank.Net

Firefox 3.6

Browse Happy logo

Open Clip Art Library

Join our Facebook Group

Twitter

Copyright © 2000-2018 UKO. Toute reproduction strictement interdite sans autorisation du webmaster

Valid XHTML 1.1 !
Valid CSS2 !
Level Triple-A conformance icon, W3C-WAI Web Content Accessibility Guidelines 1.0
ICRA Internet Content Rating Association
Creative Commons License
Site optimisé pour Firefox avec une résolution 1024x768 --- Page chargée en 0.0673878 secondes --- This site uses Thumbshots previews