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 :

Héritage et polymorphisme sur les classes et méthodes statiques


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
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Par défaut Héritage et polymorphisme sur les classes et méthodes statiques
    Bonjour,

    J'ai un problème un peu spéciale, en réalité ce n'est pas un vrai problème mais plutôt un soucis de conception que j'aimerais résoudre car j'adore la perfection ;-)

    Je vais essayer de vous exposer le problème sans code concret, en cas de problème je posterais des sources ...

    J'ai une classe appelée 'légume' qui contient une méthode STATIQUE nommée 'getFoo()' qui renvoie un entier.

    Je crée maintenant une classe carotte et choux qui hérite de légume et qui surcharge la méthode 'getFoo' en renvoyant chacun des valeurs différente.

    ... voilà pour la présentation, maitenant voici mon problème :

    J'ai une méthode dans une autre classe totalement indépendante du shéma récédent nommée 'processFoo' dont voici le prototype :

    public void processFoo(Légume monLégume);

    .... vous me voyez venir ? ... j'aimerais accéder à une méthode statique d'une classe correspondant à un objet instancié....

    Pour l'instant je fait :

    légume.getClass().getMethod("getFoo",argsType).invoke(null,args);

    Mais je trouve cela vraiment pas jolis jolis... surtout niveau refactoring ou je risque d'avoir des problèmes... Je pourrais bien sur utiliser une méthode dynamique au lieu d'une statique qui accéde ensuite à une méthode statique... ce qui régle le problème du refactoring, mais je trouve pas très bien non plus... car sa doit ralentir l'exécution (ok je chipote...) une solution ?


    Merci à tous pour votre aide, En espérant que cette requête n'est pas redondante... je n'ai pas reussi à trouver pareil question dans les archives...

    A bientôt,

    Alois Cochard
    JXTA/Orexio/CannaGrower/...

    PS: J'espère que mon langage technique est correcte et compréhensible...

  2. #2
    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 alois.cochard
    .... vous me voyez venir ? ... j'aimerais accéder à une méthode statique d'une classe correspondant à un objet instancié....
    Tu mélanges methodes static et instance ! Une méthode static est indépendante des instances...

    Citation Envoyé par alois.cochard
    Mais je trouve cela vraiment pas jolis jolis... surtout niveau refactoring ou je risque d'avoir des problèmes...
    Tout à fait d'accord !
    Citation Envoyé par alois.cochard
    Je pourrais bien sur utiliser une méthode dynamique au lieu d'une statique qui accéde ensuite à une méthode statique... ce qui régle le problème du refactoring, mais je trouve pas très bien non plus... car sa doit ralentir l'exécution (ok je chipote...) une solution ?
    Tu chipotes !!!

    Tu utilises une instance d'un objet, et tu veux exécuter une méthode selon cette instance : c'est une exécution dynamique !

    En appelant via la réflection une méthode static, tu simules le comportement de l'exécution dynamique dans un concept static, et cela doit surement être bien moins "performant" que l'appel à une méthode dynamique (qui est très bien optimiser par la JVM).


    Si tu ne veux pas utiliser de méthode dynamique, ne fait pas de POO et encore moins de Java...


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Par défaut
    Hello adiGuba,

    Merci pour ta réponse, et en la lisant je me suis rendu compte que ce que j'esseye de faire, la JVM le fait déjà automatiquement... des fois je vais chercher beaucoup trop loin... enfaite j'avais envie de 'mâcher' le travail de la JVM.. mais c'est vrai que carrement à la compilation de la classe, le compilateur doit remarquer que la méthode dynamique accéde à un élément statique et du coup faire le lien direct...

    Par contre je suis presque choqué par cette phrase :
    'Si tu ne veux pas utiliser de méthode dynamique, ne fait pas de POO et encore moins de Java...'

    Car en programmant tout en objet (obligé...), beaucoup de développeur Java font l'erreur d'oublier la notion d'élément statique et se retrouve avec des objets instanciés à de multiple reprise sans aucune nécessité ! ... alors que la notion statique est extrêmement utile pour être réellement performant en POO, notamment en utilisant les classes singleton ou encore d'autre pattern dans le genre...

    Cette remarque pourrait me faire croire que vous n'avez pas compris l'utilité des élément statique ;-) ... mais à l'inverse de votre réaction je vais plutot supposer que vous avez une grande peur de voir des gens utiliser abusement des élément statique... les empêchant ainsi de comprendre les réel avantage de la POO... peut-être un peu trop l'habitude de répondre au personne venant d'autre langage de programmation ?

    Bon je vais prendre des calmement et arrêté de remplacer la JVM par mon cerveau...

    A bientot,

    Alois Cochard

  4. #4
    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
    Citation Envoyé par alois.cochard
    Car en programmant tout en objet (obligé...), beaucoup de développeur Java font l'erreur d'oublier la notion d'élément statique et se retrouve avec des objets instanciés à de multiple reprise sans aucune nécessité ! ... alors que la notion statique est extrêmement utile pour être réellement performant en POO, notamment en utilisant les classes singleton ou encore d'autre pattern dans le genre...
    Je n'ai rien contre les éléments static lorsqu'ils sont neccessaire.

    Mais dans ce cas là cela ressemble plus à une simulation d'invocation dynamique ( appeler une méthode statique différente selon le type réel d'une instance). Dans ce cas précis il n'y a aucun raison d'être en static.

    Ce que je voulais dire c'est que l'invocation dynamique est une des bases de la POO (et en particulier de Java), et que si tu veux t'en passer pour X ou Y raison il vaut mieux changer de langage

    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 21
    Par défaut
    Bonjour,

    Enfaite le cas que j'ai exprimé dans mon 1er message correspond as un cas que l'on peut corriger en créant en effet une méthode dynamique comme je le prétendais et comme adiGuba m'as confirmé.

    J'ai voulu appliquer ces modifications dans mon projet car je détéste ces compilations dynamique que j'ai utiliser... mais malheureusement me voilà confronter à la source du problème que j'avais oublier entre temps...

    J'ai une méthode nommée 'getFoo' dont voici le prototype :

    public int getFoo(Class fooType);

    Enfaite j'aimerais de l'héritage aux niveau des class car la je passe un objet 'Class' mais sans compilation dynamique il m'est impossible d'accéder à une méthode statique ! comment faire ?

    Je vois déjà une modification du langage qui permettrait de faire un prototype du genre :

    public int getFoo(Class<Legume> fooType);


    Mais j'espère que je me trompe et qu'il y'as une autre solution ?

    Je peux de toute manière résoudre le problème en abordant la conception d'une manière différente mais qui serait malheureusement moins dynamique et moins parfaite a mon gout (... je hais les redondances de codes ...).

    Je précise que cette méthode getFoo dans le cadre où elle est utilisée ne peut pas recevoir un objet instancié. Elle souhaite faire appel a une class dont on sait qu'elle hérite de légume... en l'occurrence en vérifiant avec un 'instanceof'.... mais il doit y avoir un autre moyen...

    Je me suis fait comprendre ? Vous avez des idées ?

    Merci beaucoup pour votre aide,

    Alois Cochard

  6. #6
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Je trouve que les méthodes static sont peu pratiques en java, et je les utilise seulement pour des sortes d'utilitaires de classe.

    Les héritages et polymorphismes en particulier sont très mal gérés, à mon opinion.

    Aussi pour ton cas, soit j'ai besoin de l'héritage, et alors je rendrais la méthode getFoo méthode d'instance, profitant ainsi de toute la mécanique d'instance, soit je leur donnerais une signature spéciale pour chaque classe, par exemple getFooDeClass1(), getFooDeClass2(), etc. Cela revient un peu à ton getFoo(Class1 fooType), sauf que c'est plus radical.

Discussions similaires

  1. Réponses: 10
    Dernier message: 05/05/2007, 17h05
  2. [COM] informations sur les classes
    Par gorgonite dans le forum Visual C++
    Réponses: 3
    Dernier message: 12/12/2006, 14h31
  3. [POO] Besoin de tutorat sur les classes
    Par misterniark dans le forum Langage
    Réponses: 11
    Dernier message: 20/04/2006, 13h48
  4. demande de renseignements sur les classes
    Par altadeos dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2006, 15h59
  5. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20

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