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 :

heritage et parametres variables


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut heritage et parametres variables
    bonjour,

    j'ai posté dans la section Conception mais il ne semble pas ya avoir grand monde et comme je programme en JAVA peut-etre est-ce plus sa place.

    je viens d'implement le pattern strategie pour heriter de la methode calcul() que j'implement avec divers algos.

    mon probleme est que cette methode calcul() a un nombre de parametres differents suivant son implementation. Il y a aussi une variation sur le type des parametres (ca c'est moins grave, et encore !! ).

    Donc y a t-il un moyen de regler ce probleme ?

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 20
    Par défaut
    je ne comprends pas très bien, mais est ce qu'une simple surcharge ne suffit pas ?

  3. #3
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    moi non plus je ne comprends pas tout :
    mon probleme est que cette methode calcul() a un nombre de parametres differents suivant son implementation
    et quel est le problème ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut
    En fait mon probleme est le suivant,

    je possede une classe abstraite

    Algo
    {
    abstract double calcul () ;
    }

    ensuite je derive pour avoir Algo1 et Algo2

    Algo1
    {
    double calcul (paramType1 param1, paramType2 param2) ;
    }

    Algo2
    {
    double calcul (paramType1 param1, paramType2 param2, paramType1 param3) ;
    }

    le but etant de permettre a d'autre personne d'implementer leur propre Algo en derivant la classe abstraite Algo (s'est le pattern strategie en faite).

    le probleme comme vous le voyé est la liste des parametres qui varie suivant le type d'algo et donc la definition de la methode calcul() dans Algo est impossible.

    Existe-il un moyen ou un pattern pour resoudre ce probleme et je suis obliger de passer par exemple un vector d'Object de facon a donner un nombre variable de parametres de type inconnu (methode que je prefere eviter) ?

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Euh, une Interface ParamType dont hériteraient toutes tes classes ParamTypeX et tu passes une Liste de ParamType à ta méthode calcule...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 90
    Par défaut
    oui mais comment passer la liste ?
    si j'utilise la collection List ou Vector la methode calcul() doit connaitre a l'avance le ce que contient Vector[0],Vector[1], Vector[2], ..., pour etre sur de ne pas se tromper?

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Pour chaque classe qui implémente ton interface, tu passes les paramètres dans le constructeur... que tu stockes dans les attributs.
    Ainsi dans ta méthode calcul() (sans paramètres), tu peux les utiliser...

  8. #8
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    De toutes façons, si tous les algos que tu implémentes sont différents, je ne vois pas l'utilité de faire une méthode commune. Sinon, avec Java 1.5, on peut passer à une méthode un nombre quelconque de paramètres. En revanche, il doivent tous être du même type...

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Rayndell
    Sinon, avec Java 1.5, on peut passer à une méthode un nombre quelconque de paramètres. En revanche, il doivent tous être du même type...
    Il doivent tous être du même type... dans la déclaration de la méthode.

    Mais avec l'abstraction on peut très bien passer n'importe quel type fils, et donc en utilisant un Object on peut passer n'importe quel type


    a++

  10. #10
    Membre chevronné Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Par défaut
    Oui c'est ce que je voulais dire. Désolé.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Par défaut
    Autre idée (pseudo-code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    abstract classs Algo {
    abstract double calcul(IParametresAlgo parametresAlgo);
    }
    interface IParametresAlgo {
    int getParam1();
    int getParam2();
    int getParam3();
    }
    De sorte que quand une classe concrète AlgoX a besoin d'un paramètre supplémentaire, tu modifies uniquement IParametresAlgo (et son implémentation) et non plus toute la hiérarchie d'Algo.

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Salut,
    A mon avis, la meilleure solution c'est celle qui est indiquée par ®om plus haut. C'est-à-dire que chaque sous-classe Algo doit avoir des attributs permettant de le différencier des autres. Ce sont ces attributs qui seront utilisés pour effectuer le calcul dans la méthode héritée. Maintenant, comment tu affectes des valeurs à ces atttributs, c'est à toi de voir, soit en les passant à un constructeur, soit par des setter ... Inutile de se compliquer la vie à vouloir chercher trop loin...

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 109
    Par défaut
    Hello,

    Je ne trouve pas cette solution satisfaisante :

    Citation Envoyé par manblaizo
    Maintenant, comment tu affectes des valeurs à ces atttributs, c'est à toi de voir, soit en les passant à un constructeur, soit par des setter ... Inutile de se compliquer la vie à vouloir chercher trop loin...
    Mes raisons :

    * passer des arguments au constructeur implique d'instancier une nouvelle stratégie avant chaque calcul ou modification des paramètres de calcul. En fait ça me ferait plus penser à un pattern commande que strategie.

    * passer des paramètres avec des setXXX différents pour chaque stratégie concrète nécessite de connaître le type concrèt de la stratégie courante. Par conséquent, on perd le bénéfice du polymorphisme, ça n'est plus non plus un pattern stratégie

    Pour terminer, peut être que le pattern stratégie n'est pas adapté à la situation de new.proger...

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Janvier 2006
    Messages : 365
    Par défaut
    Citation Envoyé par MangeurVasqué
    Mes raisons :

    * passer des arguments au constructeur implique d'instancier une nouvelle stratégie avant chaque calcul ou modification des paramètres de calcul. En fait ça me ferait plus penser à un pattern commande que strategie.

    * passer des paramètres avec des setXXX différents pour chaque stratégie concrète nécessite de connaître le type concrèt de la stratégie courante. Par conséquent, on perd le bénéfice du polymorphisme, ça n'est plus non plus un pattern stratégie.

    Pour terminer, peut être que le pattern stratégie n'est pas adapté à la situation de new.proger...
    Alors là, on n'est absolument pas d'accord. D'abord, le pattern Strategy me semble approprié puisqu'il est ici question de changer d'algorithme de calcul en fonction de la situation. Ensuite, on a effectivement besoin de savoir dans quelle situation on se trouve pour pouvoir choisir l'algorithme approprié, et donc instancier la sous-classe Algo appropriée, en lui affectant les attributs nécessaires, avant chaque calcul. Ce qui fait que tes deux arguments tombent à l'eau. Le bénéfice du polymorphisme, il est au niveau de la dépendance d'une autre classe par rapport à l'algorithme réel de calcul. C'est-à-dire qu'une classe "Calculateur", par exemple, n'aurait qu'un attribut de la classe de base Algo, sur lequel elle appelle la méthode calcul(), sans se soucier de l'instance réelle de sous-classe Algo qui lui sera associée à l'exécution. Les implémentations de la méthode calcul() changent selon l'algorithme mais la signature de la méthode reste la même.
    Voilà, c'est ce que j'en pense.

Discussions similaires

  1. [XSL~FO] Nombre de paramètres variable
    Par Androrion dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/08/2006, 18h45
  2. requete SQL: where avec parametre variable
    Par dracula2000 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/05/2006, 23h46
  3. Fonction Execlp avec nombre parametres variable
    Par laurent_ifips dans le forum C
    Réponses: 3
    Dernier message: 25/11/2005, 21h14
  4. Urgent svp parametre variable de executeQuery
    Par debdev dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 12h09
  5. Réponses: 9
    Dernier message: 22/07/2005, 17h10

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