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 :

Comment éviter de dupliquer le code commun de deux class ayant une meme interface ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 518
    Par défaut Comment éviter de dupliquer le code commun de deux class ayant une meme interface ?
    Bonjour,

    J'ai deux class presque identiques à une méthode près.
    Je leur ai donné une interface commune, pour pouvoir les utiliser avec une ArrayList.
    Néanmoins il reste du code commun dupliqué.
    Peut-on éviter de dupliquer le code commun aux deux class ?


    Projet exemple complet

    Merci,


    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
    26
    27
    28
    29
    30
    31
    public class AAA01 implements Iaaa {
    	private int zz;
     
    	public AAA01(int zz) {
    		this.zz = zz;
    	}
     
    	private void setZz(int zz) {
    		this.zz = zz;
    	}
     
    	private int getZz() {
    		return zz;
    	}
     
    	public  int methodeAA(int x) {
    		setZz(getZz() + x);
    		return getZz();
    	}
     
    	public  int methodeBB(int x) {
    		setZz(getZz() * x);
    		return getZz();
    	}
     
    	@Override
    	public String toString() {
    		return String.valueOf(getZz());
    	}
     
    }


    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
    26
    27
    28
    29
    30
    31
    public class AAA02 implements Iaaa {
    	private int zz;
     
    	public AAA02(int zz) {
    		this.zz = zz;
    	}
     
    	private void setZz(int zz) {
    		this.zz = zz;
    	}
     
    	private int getZz() {
    		return zz;
    	}
     
    	public int methodeAA(int x) {
    		setZz(getZz() + x + 10);
    		return getZz();
    	}
     
    	public int methodeBB(int x) {
    		setZz(getZz() * x);
    		return getZz();
    	}
     
    	@Override
    	public String toString() {
    		return String.valueOf(getZz());
    	}
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public interface Iaaa {
     
    	public abstract int methodeAA(int x);
     
    	public abstract int methodeBB(int x);
     
    }

    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
    26
    27
    28
    29
    30
    import java.util.ArrayList;
    import java.util.List;
     
    public class MainTestJava {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		MainTestJava mainTestJava = new MainTestJava();
     
    	}
     
    	public MainTestJava() {
    		List<Iaaa> aaa = new ArrayList<Iaaa>();
     
    		aaa.add(new AAA01(100));
    		aaa.add(new AAA01(200));
    		aaa.add(new AAA02(100));
    		aaa.add(new AAA02(200));
     
    		for (Iaaa iaaa : aaa) {
    			iaaa.methodeAA(2);
    			iaaa.methodeBB(10);
    			System.out.println(iaaa.toString());
    		}
    	}
     
    }

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Tu peux passer par une classe abstraite intermédiaire.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    ou tu peux hériter AAA02 de AAA01 en redéfinissant methodAA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class AAA02 extends AAA01{
    	//....
     
    	public  int methodeAA(int x) {
    		//....
    		return getZz();
    	}

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    885
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 885
    Par défaut
    +1 pour la classe abstraitre, c'est la vision la plus logique.

    => AAA02 de AAA01 ? Si l'héritage entre les deux a un sens, oui, mais ça n'a pas l'air d'être le cas ici.

    => AAA02 et AAA01 héritent d'une classe abstraite ? Les deux validant la même interface et ayant du code en commun : leur trouver un parent commun qui, par la même occasion, validera aussi l'interface, est sans doute la solution. Ce parent n'ayant aucune raison d'être instancié, il remplit les conditions pour être une classe abstraite.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    c'est vrai que s'il n'y a pas de relation entre les 2 classes alors l'héritage n'a aucun sens mais bon, s'il y a autant de ressemblance dans le code alors je pense qu'une tel relation existe et un simple héritage ferai l'affaire

  6. #6
    Membre éclairé
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 518
    Par défaut
    J'ai bien compris ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public interface Iaaa {
     
    	public abstract int methodeAA(int x);
     
    	public abstract int methodeBB(int x);
     
    	public abstract String toString();
     
    }

    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
    26
    27
     
    abstract class AbsAAA implements Iaaa {
    	private int zz;
     
    	public AbsAAA(int zz) {
    		this.zz = zz;
    	}
     
    	protected void setZz(int zz) {
    		this.zz = zz;
    	}
     
    	protected int getZz() {
    		return zz;
    	}
     
    	public  int methodeBB(int x) {
    		setZz(getZz() * x);
    		return getZz();
    	}
     
    	@Override
    	public String toString() {
    		return String.valueOf(getZz());
    	}
     
    }

    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
     
     
    public class AAA01 extends AbsAAA{
     
    	public AAA01(int zz) {
    		super(zz);
    		// TODO Auto-generated constructor stub
    	}
     
    	@Override
    	public int methodeAA(int x) {
    		setZz(getZz() + x);
    		return getZz();
    	}
     
    }

    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
     
     
    public class AAA02 extends AbsAAA{
     
    	public AAA02(int zz) {
    		super(zz);
    		// TODO Auto-generated constructor stub
    	}
     
    	@Override
    	public int methodeAA(int x) {
    		setZz(getZz() + x + 10);
    		return getZz();
    	}
     
    }

    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
    26
    27
    28
    29
    30
    31
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class MainTestJava {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		MainTestJava mainTestJava = new MainTestJava();
     
    	}
     
    	public MainTestJava() {
    		List<Iaaa> aaa = new ArrayList<Iaaa>();
     
    		aaa.add(new AAA01(100));
    		aaa.add(new AAA01(200));
    		aaa.add(new AAA02(100));
    		aaa.add(new AAA02(200));
     
    		for (Iaaa iaaa : aaa) {
    			iaaa.methodeAA(2);
    			iaaa.methodeBB(10);
    			System.out.println(iaaa.toString());
    		}
    	}
     
    }

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/07/2014, 18h41
  2. Comment éviter de répéter du code
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/11/2011, 10h45
  3. Réponses: 6
    Dernier message: 17/12/2007, 16h16
  4. Réponses: 11
    Dernier message: 30/06/2007, 04h34
  5. Réponses: 3
    Dernier message: 17/08/2006, 04h11

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