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

avec Java Discussion :

polymorphisme, superClasse et interface


Sujet :

avec Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut polymorphisme, superClasse et interface
    Bonjour,

    Je débute avec Java, et j'ai déjà réussi à faire quelque trucs sympa. Je bute sur un problème depuis quelques jours. Je vais utiliser un exemple simplifier comme dans beaucoup de tutoriel pour vous l'expliquer.

    J'ai une superclass chien() qui contient quelques méthodes communes à tous les chiens. J'utilise aussi pour toute une série de race de chien une class particulière avec la class chien comme parent.

    Au final, un chien à une liste de méthode comme fairelebeau(), marcher(), boire(), ...
    Certaine sont générique (boire()) donc coder dans la superclass.
    D'autre sont plus spécifique donc coder dans la class coresspondant à la race.

    le problème est que je veux donner à une autre classe de control, le control de mon chien et qu'il puissent le controler quelque soit la race.

    J'ai donc toute une série de race de chien possédant toujours les même méthode, les générales dans la class parent chien et les plus spécifique dans la class correspondant à sa race.
    J'usqu'ici, je déclarais mon chien (par exemple) comme ceci
    Labrador chien = new Labrador();
    et je l'envoyais à mon gardien (gardien.addChien(chien); qui le récupérais comme ca
    public void addChien(Chien chien) {...

    Mais mon gardien n'a pas accés au méthode spécifique de mon chien.

    Je voudrais éviter de créer un gardien particulier par race de chien.

    Je sais absolument pas si mon problème est clair, c'est pas facile de l'expliquer.

    Je pense tenter d'utiliser une interface, ainsi je pourrais déclarer mon chien :
    InterfaceChien chien = new Labrador();
    mais alors je n'ai pas accès au méthode générale.

    Je ne vois pas comment avoir accés à la fois au méthode générale (je ne veux pas les redéfinir dans chaque race) et au méthode particulière.

    Merci de votre aide si vous avez compris mon problème. Sinon, précisez ce qui est compréhensible je détaillerais le reste.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    les méthodes spécifiques à chaque race sont les même, juste avec du code différente (genre tous les chien on une méthode faireLeBeau, mais chaque race le fait à sa manière) ou il y a des méthode avec un nom spécifique à chaque race?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    oui première proposition, toutes les races peuvent faire lebeau() mais pas de la même manière.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    dans ce cas, tu déclare Chien comme étant une classe abstraite et tu met dans Chien


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public abstract void faireLeBeau();

    et tu pourra appeler cette méthode sur n'importe quelle classe concrète de Chien.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci,

    Est-ce que ma classe abstraite peut contenir des méthode générales (dont le code est identique pour toutes les races) ?

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui. Une classe abstraite est en queques sorte une classe qui n'est pas entière (il manque le code de certaines méthodes). On les complètera dans les classes concrètes qui en héritent.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci cela semble bien être la solution que je cherchais.

    Encore une petite question pour la forme
    Si je déclare une méthde abstraite dans ma classe abstraite, le nombre le type d'argument est important. mais est-ce que leur nom l'est aussi

    exemple la méthode abstraite
    abstract void fairelebeau(int n);

    lorsque je la redéfinie dans une classe de race, je doit garder 1 argument int mais je peux l'appeller comme je veux ?

    Tous les exemples de classes abstraites vus sont avec des méthodes sans arguments.

  8. #8
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    Non, tu dois garder la même signature de méthode.
    La signature correspond à l'ensemble {type retournée, nom de méthode, arguments}.

    En clair, si tu déclares un "abstract void fairelebeau(int n);" dans ta classe abstraite, tu dois avoir un "void fairelebeau(int n) { ... }" dans toutes les classes concrètes qui en héritent.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    le nom n'a pas d'importance, les type seulement sont utilisés.

  10. #10
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    le nom n'a pas d'importance, les type seulement sont utilisés.
    Ah oui, en effet, je confirme, j'avais mal lu la question

    Dans la signature, il n'y a que le type des arguments, pas leur nom. Donc on peut choisir n'importe quel nom.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci à tous, et à la prochaine pour d'autre(s) question(s) (il y en aura surement)

    Edit

    J'ai encore un bug qui reste en rapport à ce problème alors je le pose en continuité.

    J'ai donc maintenant une première classe abstraite qui contient mes méthodes générales. Certaines de ces méthodes utilisent des variables qui sont instancier dans cette classe abstraite mais rempli dans les classes filles.
    Ces variables sont des tableaux dont la longueur varie selon la classe fille, je les instancies donc comme ceci dans la classe abstraite
    private Point[] points;
    ensuite dans la classe fille je les réinstance
    private Piece[] pieces = new Piece[18];
    et je rempli mon tableau dans son constructeur.

    Cependant, leur utilisation dans la classe mère (abstraite) pose problème car elle ne pointe vers rien.

    Je peux résoudre le problème en les transfèrant vers la classe fille, mais le code est strictement identique pour toutes les classes filles et donc le dupliquer le rend plus dur à maintenir avec l'augmentation de classe fille.

    Avez vous une solution à me proposer ?

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    dans la classe mère, tu définis un getter qui retourne ce tableau, en abstract. Tu l'implémente dans la classe fille. Ensuite tu n'a plus qu'à utiliser ce getter dans la classe mère.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Parfait exactement ce qu'il me fallait Merci. J'étais loin d'y penser seul

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/06/2009, 18h33
  2. Réponses: 6
    Dernier message: 08/02/2008, 14h58
  3. Réponses: 6
    Dernier message: 24/08/2006, 14h33
  4. [Language] polymorphisme, interface ...
    Par Ikit dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2005, 11h39

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