IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Conception] Paramétrage par une classe


Sujet :

Langage Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut [Conception] Paramétrage par une classe
    Supposons une classe qui reçoive en paramètre lors de son itialisation un objet d'une autre classe que l'on a defini. Je sais que l'on peut déclarer la variable qui va reçevoir l'objet avec le nom de la classe correspondante. Mais est-ce qu'il y a un moyen de s'en sortir quand on ne connait pas le type de la classe ?
    Ou plutôt , quand la variable peut etre un objet de plusieurs classes differentes .

    Je sais que Java a un typage statique , mais il y aurait pas un moyen de déclarer la variable qui reçoit la classe en "trouvant" (comment , ça j'en sais rien ) le type de la classe lors de l'affectation ? Non ?

  2. #2
    Membre actif

    Étudiant
    Inscrit en
    Mai 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 200
    Points : 276
    Points
    276
    Par défaut
    Bonjour,

    Pour le paramètre de ton constructeur tu peux utiliser le type Object (toute les classes créées dérivent de la classe Object)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public MaClasse(Object o) {
        ...
    }
    Sinon, peut être que les objets que tu va passer en paramètre de ton constructeur héritent d'une même classe ou implémentent une même interface ? Dans ce cas, tu peux mettre dans le constructeur un paramètre de même type que la classe étendue ou que l'interface.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Février 2006
    Messages
    238
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 238
    Points : 267
    Points
    267
    Par défaut
    Sallut,

    Ou sinon il a les templates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class MaClass<T> {
        public MaClass (T objet) {
            // La variable objet contient un objet de type T
        } 
    } // MaClass
     
    // Tu instancie alors ta classe de la facon suivante :
    MaClass<String> a = new MaClass<String> ("Valeur");
    Voila apres je sais pas si c'est ce que tu veux.

    a+

  4. #4
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Si toutes les classes possibles que tu peux passer en paramètres ont quelque chose en commun (des méthodes) tu pourrais passer par une interface définissant ce tronc commun. Tu n'auras plus qu'à fournir l'interface comme type.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    OK donc si je déclare ma variable avec "Object" , elle pourra contenir n'importe quel type d'objet.Super ! Je vais tester ça !

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Attention... avec le type Object, ta classe pourra effectivement contenir n'importe quoi. Mais tu ne pourras alors utiliser que les méthodes de cette classe, qui sont finalement assez limitées... (sauf à faire un cast explicite, mais ceci me paraît exclu puisque tu ne connais pas à priori le nom de la classe)

    Si ton objet doit remplir une certaine fonction par la suite, regarde plutôt ce que t'a proposé Natha: les interfaces.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    C'est bon à savoir. Donc à priori les attributs on peut y acceder avec le type de classe object.

  8. #8
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Citation Envoyé par ickylevel Voir le message
    C'est bon à savoir. Donc à priori les attributs on peut y acceder avec le type de classe object.
    Et bien justement non. L'attribut "vitesse" d'une classe "Voiture" par exemple, n'est accessible que si ta variable est connue comme étant une "Voiture". Si tu déclare:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Object unObjet = new Voiture();
    Tu n'as accès à aucun des attributs (ni aucune des méthodes) propres à ta voiture, et en particulier, tu n'as pas accès à la vitesse. Pour y avoir accès, tu dois obligatoirement passer par un "cast" de ta variable:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // cast explicite obligatoire
    int jeVeuxRecupererLaVitesse = ((Voiture) unObjet).vitesse;

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Ok , alors la seul solution consiste en un "bidouillage" (faire un interface pour tout les objets possibles).

  10. #10
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Points : 4 314
    Points
    4 314
    Par défaut
    Citation Envoyé par ickylevel Voir le message
    Ok , alors la seul solution consiste en un "bidouillage" (faire un interface pour tout les objets possibles).
    Je ne suis pas d'accord avec ton terme de "bidouillage". Créer une interface générique pour les différents objets que ta classe peut contenir, c'est une manière de programmer propre. Et les interfaces ont justement été créées pour ça.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Je repond un peu tardivement ,mais je ne me suis repenché que tardivement sur le probleme. Les Methodes de mes objets sont differentes , mais mon problème est surtout de pouvoir accéder aux attributs des objets .

  12. #12
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Il faut que tes classes aient des points communs, sinon ça n'a aucun sens.
    Merci d'exposer ton problème avec un cas concret parce que ce n'est pas vraiment clair.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Dans chaque case d'un tableau 2d , il y a un objet qui symbolise une zone de coordonée xy du tableau et contient un tableau qui contient des objets de types differents. Du coup le tableau 2d represente la position des objects contenus dans la zone (c'est le seul point commun à tout les objets du tableau ,et il est implicite). Même si certains objects ont des point commun entre eux , d'autres n'en ont pas du tout. Je pense que je vais ajouter un sous tableau pour chaque type d'objet.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Bonjour,

    En effet, il faudrait que tu expliques ton problème plus en détail. :-)
    Quand on débute en Java, le fait de passer par des paramètres Object relève souvent (pas toujours, mais souvent) d'une erreur de conception dans le programme.
    Si tu nous en dis plus, on pourra t'aider. :-)

    Nicolas

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Ton message précédent n'est pas hyper-clair.
    Ton tableau 2D contient des objets, qui contiennent eux-mêmes des ensembles d'objets, c'est cela ?
    Peux-tu nous donner des "exemples" de tels objets ?

    Nicolas

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 45
    Points : 29
    Points
    29
    Par défaut
    Ok ok ! J'ais commencé un jeu en python , et maintenant je le fais en Java.
    Le tableau 2d est une representation du monde. Chacune de ces cases est une zone. Une zone peut avoir plusieurs caracteristiques , ce qui explique le fait que ça soit un objet. La zone peut contenir tout sorte d'objet (dans mon cas ça va des unités au planetes (c'est dans l'espace)). Une planete n'a pas de point commun avec un vaisseau (differentes méthodes , attributs) .

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    429
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 429
    Points : 475
    Points
    475
    Par défaut
    Une planete n'a pas de point commun avec un vaisseau
    ... mais ils sont plus proches entre eux qu'avec la classe PersistanceManager qui stocke les données sur ton disque dur, ou bien la classe MessageJDialog qui affiche des messages à l'utilisateur.

    Tu pourrais les faire tous implémenter une interface GameEntity (ce n'est qu'un exemple), pour l'instant vide, mais qui pourrait se remplir plus tard, qui sait.

    Nicolas

  18. #18
    Membre expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Points : 3 083
    Points
    3 083
    Par défaut
    Bon c'est difficile de comprendre comment tu as modélisé ton truc et comment tu crées tes méthodes mais si je devais faire ça j'essaierais de faire un max de choses communes à mes objets et du code spécifique pour ce qui est... spécifique.

    Dans mes cases je peux mettre différentes choses, soit, mais elles ont des points communs (par exemple) :
    - une image pour être dessinée (ou une méthode de dessin)
    - des caractéristiques simples
    - taille
    - poids
    - type (tu peux regrouper les objets de mêmes types, une planète n'est pas un vaisseau mais tu as sûrement différents types de vaisseaux dont tu peux regrouper les points communs)
    - possibilités de déplacement
    - etc...

    En gros il faut que tu fasses un arbre des objets pouvant aller dans tes cases en essayant de regrouper ce qui peut l'être et de spécialiser au fûr et à mesure.

    Difficile de t'aider plus. Pour programmer il faut faire ses propres expériences, bonnes ou mauvaises.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/07/2017, 09h53
  2. Réponses: 4
    Dernier message: 25/10/2007, 16h04
  3. Conception: héritage d'une classe abstraite
    Par Kikito dans le forum Langage
    Réponses: 19
    Dernier message: 05/10/2006, 17h36
  4. ou mettre une structure utilisée par une classe
    Par grand's dans le forum C++
    Réponses: 10
    Dernier message: 28/07/2005, 18h53
  5. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo