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 :

Eviter les class cast ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Par défaut Eviter les class cast ?
    Bonjour à tous,
    je me suis à plusieurs reprises posé la même question, sans jamais en trouver de réponse satisfaisante, et ce matin, j'ai de nouveau rencontré le problème, alors je le soumets à votre sagacité.
    Voilà, je souhaite placer des particules (virtuelles) dans une boîte (virtuelle). La boîte sera dotée de méthodes propres, permettant par exemple de faire des calculs statistiques indépendant de la forme de la particule. En revanche, les particules peuvent être de formes diverses. Jusque là, tout va bien, on définit une interface Particle, et c'est fini. Le problème, c'est que mes particules sont dures, c'est à dire qu'elles n'ont pas le droit de se recouvrir. Il faut donc ajouter une méthode de test de recouvrement dans l'interface, et on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Particle2d{
    public boolean overlaps(Particle2d p);
    }
    Seulement, je ne suis pas capable d'implémenter un test "universel", et je ne le souhaite d'ailleurs pas, pour des raisons de temps d'exécution. En d'autres termes, je ne veux tester que le recouvrement de sphères entre elles, de cylindre entre eux, etc... Comment faire, sans faire commencer les implémentations de overlaps par un cast ?

    Je suis preneur de vos lumières à ce sujet...

    Sébastien

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Et comment vas-tu faire pour appeler "overlaps" sur deux "Particle" de même type ?

    Tu peux ajouter une méthode dans l'interface : "getType" qui renvoie un entier dénotant le type de particule.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Par défaut
    En fait, au moment d'ajouter des particules dans ma boîte, une méthode (contenue dans la classe associée à ma boîte de simulation) testera si la nouvelle particule recouvre ou non l'une des particules déjà contenues dans la boîte. Le code correspondant est de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Iterator<Particle2d> i = iterator();
    while (i.hasNext()){
      if (i.next().overlaps(p)){
        // Ajouter un traitement
      }
    }
    add(p);
    (il existe des optimisations pour ne pas tester TOUTES les particules, mais ce n'est pas l'objet ici...).
    En fait, à la création de ma boîte, je saurai si j'y mets plutôt des sphères, ou plutôt des cylindres, ou autres. J'aimerais donc m'éviter des tests de type. Je pense que les génériques doivent être la réponse, mais je ne suis pas trop sûr.
    En ce qui concerne la méthode getType() : elle se prête assez difficilement à l'extension, non ?
    Merci beaucoup,
    Sébastien

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 43
    Par défaut
    Merci Morph41 pour ta réponse,
    cela pourrait marcher, mais là encore, je pense que l'extension ne soit pas facile (suppose que demain, je souhaite avoir des particules cubiques, il faudra que je modifie mon interface...).
    Sébastien

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Ca me fait penser à l'antipattern cercle-ellipse (ou du rectangle-carré) qui viole le principe de substitution de liskov. Grosso modo, il n'y a pas de méthode miracle pour ton cas (notamment car overlaps doit être définie pour tous les sous types (donc il faut forcement se farcir des cast pour tester avec les autres sous types) ce qui fait qu'il faudrait se demander si la méthode overlaps doit se trouver dans l'interface Particle ou non (ça permet de ne pas modifier les classes implémentant Particule2D à chaque ajout d'une nouvelle particule mais une seule méthode d'une classe utilitaire) ...)

  6. #6
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Peut-être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Particle2d{
        public boolean overlaps(Sphere2d p);
        public boolean overlaps(Cylindre2d p);
    }
    Chaque classe implémente seulement la méthode qui la concerne, l'autre reste vide ou avec un message d'erreur "Not Supported".

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

Discussions similaires

  1. [Taglibs] Utiliser les classes css ?
    Par PeteMitchell dans le forum Struts 1
    Réponses: 4
    Dernier message: 05/05/2007, 01h31
  2. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  3. Les classes ne s'affichent pas
    Par karl3i dans le forum MFC
    Réponses: 8
    Dernier message: 26/01/2004, 14h52
  4. delocaliser les classe
    Par otb82 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 17/11/2003, 08h54
  5. Les classes amies en Delphi
    Par Bruno75 dans le forum Langage
    Réponses: 3
    Dernier message: 02/09/2003, 19h34

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