Objet Package

Fermé
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 - Modifié par Étienne9 le 22/04/2013 à 16:57
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 28 avril 2013 à 19:15
Bonjour à tous,

J'ai deux fichiers Affichable et Fourmi qui sont dans le même dossier à savoir animaux qui est lui-même dans simulation.

.....simulation
..........animaux
...............Affichable.java
...............Fourmi.java
..........jeu
...............AntSimulationInterface.java

Problème : j'ai d'autres dossiers dans simulation donc je suis obligé de mettre des packages...
Dans Affichable et Fourmi j'ai donc mis :
package simulation.animaux;
Résultat : Fourmi ne trouve plus Affichable.

C'est dingue ! Ils sont dans le même dossier et en plus dans le même package et ils n'arrivent pas à se voir....

De plus, comme vous le voyez j'ai AntSimulationInterface.java qui est dans jeu, j'ai fait un :
import simulation.animaux.*; mais lui non plus ne voit pas Affichable. J'avoue ne pas comprendre....

Quelqu'un peut m'aider s'il vous plaît ?

8 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
23 avril 2013 à 18:31
Quand on fait "javac" il faut être à la racine du projet, sinon tes packages ne servent à rien. Dans ton image tu es dans "U:\...\TP Objet\simulation\animaux" donc c'est normal qu'en enlevant les packages tu obtiennes ce que tu veux puisque dans ce cas il considère qu'il n'y a pas de package et que la racine du projet est le dossier "animaux", mais cela explique aussi pourquoi il n'est pas possible de faire appel à Affichable dans AntSimulationInterface puisque ce code source n'est pas dans ton projet (vu que le dossier jeu n'est pas un répertoire de "animaux")

Ce qu'il faut faire c'est te positionner dans ton dossier "TP Objet", et faire appel au javac depuis cet emplacement. Remarque : c'est la classe qui contient le main qu'il faut compiler, or ici tu compiles Affichable qui est une interface, il n'y a aucune chance que cela te génère une classe exécutable.

Supposons que ta méthode main soit par exemple dans ta classe Test suivant :

package simulation.test;

import simulation.jeu.AntSimulationInterface;
import simulation.animaux.Affichable;
import simulation.animaux.Fourmi;

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Test");
    }
}

Alors ta commande de compilation devrait être :

U:\Travail\TP Informatique\S4\TP Objet>javac simulation/test/Test.java
1
jeremy.s Messages postés 1226 Date d'inscription lundi 28 mars 2011 Statut Membre Dernière intervention 2 septembre 2013 79
22 avril 2013 à 17:30
Salut !

As tu essayé de mettre un import dans Affichable et Fourmi ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
22 avril 2013 à 18:38
Si tu as bien fait exactement ce que tu décris (Fourmi et Affichable dans le même package simulation.animaux), tu ne devrais pas avoir de problème. Fourmi verra bien Affichable, et Affichable verra Fourmi.
L'erreur est donc que tu n'as pas vraiment cela. Par exemple parce que tes classes n'ont jamais été compilées à cause d'autres erreurs. Ce qui expliquerait aussi pourquoi AntSimulationInterface ne peut pas voir Affichable malgré l'import que tu as fait.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
23 avril 2013 à 00:19
Si j'enlève les :
package simulation.animaux;
Alors tout marche bien et aucune erreur.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
23 avril 2013 à 05:56
Alors tes fichiers ne sont pas dans le dossier /simulation/animaux comme tu le dis...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 23/04/2013 à 10:33
Preuve :
http://img15.hostingpics.net/pics/119264Sanstitre.jpg
Sur la preuve j'ai tout mis.
Et j'ai même compilé Affichable pour vous montrer.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
23 avril 2013 à 13:44
Et si je fais :
import simulation.animaux.*;
Il me dit qu'il ne trouve pas.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 24/04/2013 à 09:28
Bonjour,

Je vais essayer, merci beaucoup.
Par contre, je dois utiliser l'Interface du prof pour ma simulation de Fourmi mais il a dit qu'on pouvait modifier son code.
Et il se trouve que je n'aime pas son Interface car je vais devoir gérer le tableau de couleur en même temps... J'aimerai en gros dissocier son interface complètement à 100% de mon code.
Alors j'aimerai faire ceci :

Dans InterfaceAntSimulation, ce n'est que là qu'il y a aura le tableau de couleur et nul part ailleurs. Il y aura une fonction qui prendra un tableau Affichable tab[][] et testera chaque case pour mettre à jour son Color[][] g sachant que dans le tableau d'Affichable il peut y avoir une Fourmi Guerrière, une Bestiole, un nid etc... Si une case case == null alors met la case blanche dans l'affichage, sinon il fait appelle à la fonction affichage de l'objet.
En gros : g[x][y] = tab[x][y].affichage();
La fonction de l'objet affichage() renverrait une couleur.

J'aimerais savoir si cela fait vraiment "Programmation Objet".

Cordialement et merci encore.
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 27/04/2013 à 17:53
L'enseignant m'a dit que c'était une mauvaise idée car le jour où je voudrai changer la forme je ne pourrai pas.

Donc comme vous le savez je dois faire une simulation de fourmis sauf que j'ai une question à vous demander. En fait j'ai un Simulation.java qui se chargera de tout lancer.
Dans Simulation.java il y aura donc en variable globale un :
public AntInterfaceSimulation jeu;
Ma question est la suivante : est-ce que dans les objets Fourmis, Bestiole etc. jeu sera visible ?
Je suppose qu'il faudra dans chaque objet faire un import de Simulation non ?

merci beaucoup d'avance

Modification du message:

De plus, voilà mon Code dans Simulation.java pour le moment et je ne comprends pas pourquoi il me dit que jeu est null.
Vous pouvez m'aider s'il vous plaît ?

package simulation.jeu;
import java.awt.*;

public class Simulation {
	public static AntSimulationInterface jeu;
	static {
		Color t[][];
		t = new Color[50][100];
		AntSimulationInterface jeu;
		jeu = new AntSimulationInterface("Simulation de fourmis",t,5);
		jeu.clear();
	}
	public static void main(String args[]) {
		jeu.set(10,10,Color.blue);
		jeu.refresh();
	}
}
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
27 avril 2013 à 18:33
Tes questions n'ont plus rien à voir avec le message d'origine, s'il ne faut pas faire deux discussions pour le même problème, là par contre tu aurais pu faire une nouvelle discussion...

Menfin, c'est pas grave, continuons ici :

"Ma question est la suivante : est-ce que dans les objets Fourmis, Bestiole etc. jeu sera visible ? Je suppose qu'il faudra dans chaque objet faire un import de Simulation non ?"

Ça dépend comment c'est fait, et quel rôle joue vraiment la classe de simulation.
Le comportement d'une fourmi (ou autre bestiole) doit dépendre de son environnement, donc il serait normal d'avoir une référence à cet environnement pour chaque fourmi. En revanche, la simulation ne devrait pas intervenir sur les fourmis (sauf création et destruction), tout au plus la simulation modifiera l'environnement (notamment le vent qui intervient dans l'évaporation des phéromones). Mais tout cela dépend du but de ton programme dont je ne sais rien...

"je ne comprends pas pourquoi il me dit que jeu est null."
Le problème c'est que tu définis deux fois AntSimulationInterface jeu, la première fois avec les attributs public static, et une deuxième fois dans ton bloc de code static, dans ce cas c'est considéré comme une variable locale à ton bloc de code, et cette variable est "prioritaire", c'est à dire que c'est elle qui est initialisée avec new, le membre public static lui n'est pas modifiée, il conserve donc sa valeur null par défaut, ce qui explique pourquoi tu as null lorsque tu arrives dans ton main.

Voici donc une correction de ton code :

public static AntSimulationInterface jeu;

static 
{
    Color t[][] = new Color[50][100];
    jeu = new AntSimulationInterface("Simulation de fourmis",t,5);
    jeu.clear();
}

public static void main(String args[])
{
    jeu.set(10,10,Color.blue);
    jeu.refresh();
}

Cependant je te conseilles d'éviter l'utilisation de bloc de codes static comme ça, parce qu'ils entraînent rapidement des erreurs inattendues, en particulier si tu oublies le mot-clé static.
Ici bien sûr ça marcherait, mais je te conseilles plutôt d'utiliser une méthode d'initialisation :

public static AntSimulationInterface jeu = initJeu();

private static AntSimulationInterface initJeu()
{
    Color t[][] = new Color[50][100];
    AntSimulationInterface jeu = new AntSimulationInterface("Simulation de fourmis",t,5);
    jeu.clear();
    return jeu;
}

public static void main(String args[])
{
    jeu.set(10,10,Color.blue);
    jeu.refresh();
}

Remarque : en pratique on a plutôt l'habitude de tout mettre dans le main, c'est plus simple, ça évite donc bien des erreurs...

public static void main(String args[])
{
    Color t[][] = new Color[50][100];
    AntSimulationInterface jeu = new AntSimulationInterface("Simulation de fourmis",t,5);
    jeu.clear();
    jeu.set(10,10,Color.blue);
    jeu.refresh();
}
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 28/04/2013 à 09:58
Bonjour KX et merci beaucoup.
Sauf que je ne veux pas mettre dans le main, sinon mon tableau de couleur sera visible et donc : quel est l'intérêt d'avoir fait une fonction qui met une couleur dans une case dans l'interface ?
Plus c'est privé, mieux c'est !
Au pire je pense que le mieux c'est de modifier l'interface du Prof et te donner la taille du tableau de couleur dans le constructeur et l'initialisation de se fait dans l'interface. Non ?

Merci beaucoup encore :)
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
28 avril 2013 à 12:27
"sinon mon tableau de couleur sera visible"
Visible par qui ? Ton tableau t est toujours déclaré de la même manière, c'est une variable locale. Qu'il soit déclaré dans le code static, la méthode d'initialisation, ou la méthode main, il aura toujours le même rôle ! La seule manière d'y accéder c'est en récupérant sa valeur dans le constructeur AntSimulationInterface, et là encore les trois codes feront la même chose...

"quel est l'intérêt d'avoir fait une fonction qui met une couleur dans une case dans l'interface ? Plus c'est privé, mieux c'est !"
Le seul intérêt est de pouvoir initialiser l'objet jeu que l'on utilise la méthode main ou non, c'est à dire que tu pourrais coder un main dans une autre classe, et récupérer ton objet jeu initialisé et prêt à l'emploi alors qu'il sera utilisé en dehors de son contexte ! En terme de confidentialité l'utilisation du 3è code (avec tout dans le main) protège bien plus les données que l'utilisation de ton public static jeu...

"donner la taille du tableau de couleur dans le constructeur et l'initialisation de se fait dans l'interface"
Tu parles de faire quelque chose comme ceci :

public AntSimulationInterface(String str, int w, int h, int n)
{
    this(str, new Color[w][h], n);
}

public static AntSimulationInterface jeu = new AntSimulationInterface("Simulation de fourmis",50,100,5);

Ça permet de simplifier un peu l'utilisation du constructeur de jeu, mais en terme de confidentialité ça ne change rien, le tableau de couleur n'était pas accessible avant, et il ne l'est toujours pas, et l'objet jeu était complètement accessible, et il l'est toujours...

Il faudrait peut-être que tu revoies cette notion de "confidentialité" de données, parce que là tu essayes de protéger le tableau de couleurs qui est déjà protégé, sans rien faire pour l'objet jeu qui lui n'est pas du tout protégé !
En plus, pour ce genre de programmes, la protection des données a très peu d'intérêt...
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
Modifié par Étienne9 le 28/04/2013 à 15:22
Le problème c'est que si je mets tout dans le main, il n'y a aucun intérêt de faire jeu.set(10,10,Color.blue) car je fais directement t[10][10] = Color.blue;

Par contre j'ai une autre question. Est-ce que dans le constructeur de mon objet je peux faire un affichage direct lors du lancement du constructeur ?

Et j'ai une fonction mourir pour chaque vivant (dans Fourmi et Bestiole), est-ce que je peux effacer automatiquement l'affichage dans ma fonction mourir ?


Merci beaucoup d'avance.
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
28 avril 2013 à 18:18
"il n'y a aucun intérêt de faire jeu.set(10,10,Color.blue) car je fais directement t[10][10] = Color.blue"
Peut-être que cela reviendrait au même dans ton cas, mais de mon point de vue, rien ne me garantit que lorsque je fais set(10,10) c'est exactement la même chose que faire t[10][10], parce que le tableau pourrait avoir été copié dans le constructeur, soit dans un autre tableau, soit dans une autre structure, et normalement modifier le tableau après l'appel du constructeur ne devrait pas avoir d'effet rétroactif, ou alors ce serait un gros problème de conception. De plus tu pourrais avoir des traitements complexes dans la méthode jeu.set qui feraient un peu plus qu'une simple affectation du tableau, par exemple une mise à jour de l'interface graphique, un affichage, etc.
Si une autre personne utilises ta classe mais fais une autre classe de test, et qu'il utilise le tableau t comme je l'ai fait, il ne faut pas que cela modifie le comportement de ta simulation, il faut que ton programme soit consistant (ce qui n'a rien à voir avec la confidentialité).

"Est-ce que dans le constructeur de mon objet je peux faire un affichage direct lors du lancement du constructeur ?"
À deux exceptions près, tu peux effectivement faire un System.out.println, ou n'importe quel autre type d'affichage, dès la première instruction de ton constructeur, comme avec n'importe quelle autre méthode. Les deux exceptions sont respectivement l'utilisation de this et super pour appeler un autre constructeur, ces appels doivent se faire en première instruction, et tu ne pourras faire qu'un affichage après ces appels, sauf bien sûr si tu fais l'affichage à l'intérieur des constructeurs appelés.

"est-ce que je peux effacer automatiquement l'affichage dans ma fonction mourir"
Là, je ne comprends pas... Si tu ne veux rien voir d'afficher, tu n'affiches rien, effacer un affichage est plus difficile (voire impossible s'il s'agit d'un println par exemple)
0
Étienne9 Messages postés 1022 Date d'inscription mardi 1 mars 2011 Statut Membre Dernière intervention 10 mai 2015 49
28 avril 2013 à 19:03
Ma dernière question était :
Dans la class Fourmi il y a une fonction mourir.
Est-ce la fonction mourir peut prendre en paramètre un AntSimulationInterface et un tableau d'Affichable et enlever de l'affichage + enlever dans le tableau d'Affichable ?
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
28 avril 2013 à 19:15
Dans la mesure où je n'ai pas du tout de code de ton programme, il est difficile de savoir de quoi tu parles ! Il faudrait savoir comment est gérer l'affichage, et quel est le lien entre le tableau d'Affichable, et ton AntSimulationInterface. Mais ça me paraît compliqué à faire si ce n'est pas prévu en amont.
0