JAVA , appele des méthodes

Fermé
kadis500 Messages postés 33 Date d'inscription dimanche 26 août 2007 Statut Membre Dernière intervention 21 avril 2012 - 28 déc. 2011 à 16:52
KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 28 déc. 2011 à 17:54
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:

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
A voir également:

1 réponse

KX Messages postés 16754 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 020
Modifié par KX le 28/12/2011 à 18:26
Sauf dans des cas très précis (pour redéfinir des méthodes de la classe Object, ou pour identifier les types templates par exemple), tu ne devrais pas avoir de instanceof dans ton code !

Il y a très certainement un problème de conception dans ta structure de classe.
Par exemple ici, n'y a pas de raison que ajout soit une méthode de l'interface MatriceCarree, elle devrait plutôt être une méthode d'une interface Matrice dont hériterait MatriceCarree et les autres.

Voici le genre d'arborescence qui paraît un peu plus adapté à ton problème :

interface Matrice<E> 
{ 
    public void ajouter(Matrice<E> m); 
} 

interface MatriceCarree<E> extends Matrice<E> 
{ 
    public double determinant() throws ArithmeticException; 
} 

class MatriceTableau<E> implements Matrice<E> 
{ 
    @Override 
    public void ajouter(Matrice<E> m)  
    { 
    } 
} 

class MatriceCreuse<E> implements Matrice<E> 
{ 
    @Override 
    public void ajouter(Matrice<E> m) 
    { 
    } 
} 

class MatriceCarreTableau<E> extends MatriceTableau<E> implements MatriceCarree<E> 
{ 
    @Override 
    public double determinant() throws ArithmeticException 
    { 
        return 0; 
    } 
} 

class MatriceCarreCreuse<E> extends MatriceCreuse<E> implements MatriceCarree<E> 
{ 
    @Override 
    public double determinant() throws ArithmeticException 
    { 
        return 0; 
    } 
}
La confiance n'exclut pas le contrôle
0