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

Java Discussion :

Classe abstraite et appel de méthode


Sujet :

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
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut Classe abstraite et appel de méthode
    Bonjour,
    J'ai deux classe MatriceTableau et MatriceCreuse qui héritent d'une classe abstract AbstractClass, et cette dernière implémente une interface MatriceCarree, cette interface contient une méthode "ajoute" qui permet de faire l'addition entre deux matrice.


    j'ai redéfinit la méthode "ajoute" de l'interface dans MatriceTableau;MatriceCreuse et AbstractClass

    Si les deux matrice sont de type MatriceTableau (resp MatriceCreuse) alors la méthode "ajout" de la classe MatriceTableau (resp MatriceCreuse) est exécutée.
    Sinon les deux matrices sont de type différentes alors la méthode "ajout" de la classe AbstractClass est éxécuté


    LA structure de mon programme est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public interface MatriceCarree {
       void ajoute (MatriceCarree m) throws IllegalArgumentException ;
    }
     
    public abstract class AbstractClass implements MatriceCarree {
     
    public void ajoute(AbstractClass  matrice) throws IllegalArgumentException {
    blabla}
     
    }
     
    public class MatriceTableau extends AbstractClass {
     
    public void ajoute(MatriceCarree m)  {			
     
    if (m instanceof MatriceTableau)	{traitement1} 
    else super.ajoute((AbstractClass)m);
    				   }	
     
    public class MatriceCreuse extends AbstractClass {
    public void ajoute(MatriceCarree m)  {			
     
    if (m instanceof MatriceCreuse)	{traitement1} 
    else super.ajoute((AbstractClass)m);
     }
    Mon problème est que c'est la méthode "ajout" de la classe AbstractClass qui est toujours éxécuté.

    Merci pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Au moment de l'appel de ajoute, si tu imprimes dans la console pour voir à quelles classes appartiennent réellement tes objet, ça donne quoi ?

  3. #3
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Est ce que tu peux montrer le code qui correspond à l'exemple donnée (c'est à dire les creations d'objet et l'appel à la fonction ajoute) ?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par kadis500 Voir le message
    Si les deux matrice sont de type MatriceTableau (resp MatriceCreuse) alors la méthode "ajout" de la classe MatriceTableau (resp MatriceCreuse) est exécutée.
    Sinon les deux matrices sont de type différentes alors la méthode "ajout" de la classe AbstractClass est éxécuté
    Ce n'est pas ce que me dit ton code. D'après ton code, si tu appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MatriceCarree carre = .....;
    matriceTableau.ajoute(carre);
    alors ce sera la méthode de MatriceTableau qui sera appellée.
    Par contre si tu utilise une classe qui étends AbstractClass, exemple matriceTableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MatriceTableau tableau = .....;
    matriceTableau.ajoute(tableau);
    alors ce sera la méthode de l'AbstractClass qui sera appelée. La raison en est que java utilise toujours la méthode dont la définition est la plus proche des paramètres d'invocation. Dans ton cas, MatriceTableau est à la fois une AbstractClass et une MatriceCarree, mais l'AbstractClass a priorité (car fils de MatriceCarree). Donc quand tu passe un MatriceTableau, c'est la méthode ajoute(AbstractClass) qui a priorité sur ajoute(MatriceCaree).

    Le mieux à faire, dans ton cas, c'est que toutes les méthodes ajoute aient la même signature
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public interface MatriceCarree {
       void ajoute (MatriceCarree m) throws IllegalArgumentException ;
    }
     
    public abstract class AbstractClass implements MatriceCarree {
     
    public void ajoute(MatriceCaree  matrice) throws IllegalArgumentException {
    blabla}
     
    }
     
    public class MatriceTableau extends AbstractClass {
     
    public void ajoute(MatriceCarree m)  {			
     
    if (m instanceof MatriceTableau)	{traitement1} 
    else super.ajoute(m);
    				   }	
     
    public class MatriceCreuse extends AbstractClass {
    public void ajoute(MatriceCarree m)  {			
     
    if (m instanceof MatriceCreuse)	{traitement1} 
    else super.ajoute(m);
     }
    Tu notera au passage que le code est plus simple

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

    Informations forums :
    Inscription : Février 2008
    Messages : 13
    Par défaut
    Merci pour votre réponse , j'ai utilisé la même signature pour toutes les méthodes et ça marche maintenant .
    MERci beacoup

    Citation Envoyé par tchize_ Voir le message

    Le mieux à faire, dans ton cas, c'est que toutes les méthodes ajoute aient la même signature

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/07/2013, 09h04
  2. Réponses: 5
    Dernier message: 14/10/2012, 19h25
  3. Réponses: 15
    Dernier message: 08/07/2012, 23h49
  4. Réponses: 5
    Dernier message: 29/12/2010, 15h13
  5. Réponses: 3
    Dernier message: 15/01/2008, 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