Partage
  • Partager sur Facebook
  • Partager sur Twitter

Héritage : Tableau de SuperClasse, remplie de filles divers

Sujet résolu
    2 janvier 2009 à 21:45:00

    Bonsoir,

    Je fait un Projet de gestion de Bibliothèque, où les ouvrages sont traité par type : Polycopies, Revues ou Livres.

    Le Projet est bien plus grands que ça, mais je vous informe juste de la partie où je suis coincé :
    voilà, un Ouvrage, caractérisé par : le code, pour le Polycopié : en plus du code, il y a lafilière et pour la Revue : en plus du code, il y a l'année de parution

    Pour cela j'ai crée la classe Ouvrage tel que suit :


    class Ouvrage {
    	protected String code;
    	
    	public Ouvrage(){
    		code = "";
    	}
    	
    	public Ouvrage(String code){
    		this.code = code;;
    	}
    	
    	public String getCode(){
    		return code;
    	}
    	
    	public void setCode(String code){
    		this.code = code;
    	}
    	public String toString(){
    		return code;
    	}
    	
    	public void clone(Ouvrage o){
    		setCode(o.code);
    	}
    }
    



    et les Classes Polycopies et Revue qui héritent de d'Ouvrage :


    class Polycopie extends Ouvrage {
    	String filière;
    	
    	public Polycopie(){
    		super();
    		filière = "";
    	}
    	
    	public Polycopie(String code, String filière){
    		super(code);
    		this.filière = filière;
    	}
    	
    	public String getFilière(){
    		return filière;
    	}
    	
    	public void setFilière(String filière){
    		this.filière = filière;
    	}
    	
    	public String toString(){
    		return "Polycopie : "+super.toString()+" "+filière;
    	}
    	
    	public void clone(Polycopie p){
    		super.clone(p);
    		setFilière(p.filière);
    	}
    }
    
    class Revue extends Ouvrage {
    	int parution;
    	
    	public Revue(){
    		super();
    		parution = null;
    	}
    	
    	public Revue(String code);
    		this.parution = parution;
    	}
    	
    	public Date getParution(){
    		return parution;
    	}
    	
    	public void setParution(int parution){
    		this.parution.clone(parution);
    	}
    	
    	public String toString(){
    		return "Revue : "+super.toString()+" "+parution;
    	}
    	
    	public void clone(Revue r){
    		super.clone(r);
    		setParution(r.parution);
    	}
    



    Le Problème peut être compris avec une petit coups d'oeil sur le main() et l'exécution :

    public class Programme {
    
    	public static void main(String[] args) {
    		
    		Ouvrage[] T1 = new Ouvrage[2];
    		Ouvrage[] T2 = new Ouvrage[2];
    
    		T1[0] = new Polycopie("M33/acx", "MIP");
    		T1[1] = new Revue("A32/bet", 2000);
    		
    		for(int i=0;i<2;i++)
    			T2[i].clone(T1[i]);
    
    		for(int i=0;i<2;i++)
    			System.out.println(T1[i]);
    		
    		for(int i=0;i<2;i++)
    			System.out.println(T1[i]);
    	}
    
    }
    


    Polycopie : M33/acx 1987
    Revue : A32/bet 2000
    
    Polycopie : M33/acx 0
    Revue : A32/bet 0


    La variable membre annéeUnivérsitaire n'a pas été affecté par la fonction clone(), et c'est du a la restriction des données lors du Clonage, Donc est il possible de le faire autrement ?

    Ce clonage j'en ai besoin par ce que j'utilise un Tableau d'Ouvrages qui contiendra Livres, Polycopies et/ou Revue.

    Voilà j'espère que mon problème est Compréhensible, et que l'on puisse m'aider, Merci d'avance ;)
    • Partager sur Facebook
    • Partager sur Twitter
      2 janvier 2009 à 22:41:06

      Je ne pense pas ...
      tu lui demande de le considerer comme un ouvrage :o
      forcement il vas appeler la methode clone de ouvrage et pas de Polycopie

      un truc que tu pourrais faire c'est ça

      public class Programme {
      
      	public static void main(String[] args) {
      		
      		Ouvrage o = new Polycopie("M33/acx", 1987);
      		Ouvrage o2 = new Polycopie();
      		
      		((Polycopie) o2).clone((Polycopie)o);
      
      		System.out.println(o);
      		System.out.println(o2);
      	}
      


      Alors je te conseil de rajouter a ouvrage soit un boolean si Polycopie est le seul type qui héritera de ouvrage
      soit un int et de faire ça :

      A ouvrage tu rajoute
      boolean IsAPolycopie;
      dans le constructeur
      IsAPolycopie = false;


      dans le constructeur de Polycopie tu rajoute
      IsAPolycopie = true;


      voilà pour cloner, tu créer une nouvelle méthode de ouvrage;

      public void Specialclone(Ouvrage p){
          
          if(p.IsAPolycopie && this.IsAPolycopie){
                ((Polycopie) this).clone((Polycopie)p);
            }
         }
      
      • Partager sur Facebook
      • Partager sur Twitter
        2 janvier 2009 à 22:50:17

        et pour lui signaler d'utiliser la méthode clone approprié, j'ai utilisé un Casting comme suit, pour le cas de Polycopie :

        T2[0].clone((Polycopie) T1[0]);
        


        ce qui m'affiche bien ce que je veux, mais a condition que j'effectue le Casting adéquat !

        Maintenant Comment faire pour effectuer le Casting voulu, le temps voulu ?
        • Partager sur Facebook
        • Partager sur Twitter
          2 janvier 2009 à 22:53:40

          ben c'est expliqué plus haut :p
          dans mon poste précédent :p
          petit impatients :p

          je pense qu'il y'a une méthode pour retrouver le type de l'objet mais je la connais pas alors je t'ai proposer une autre solution :o


          elle ne marche que pour un héritier :p si tu veux en mettre plusieurs ...tu dois remplacer le boolean par un int (ou un String et faire un case)

          switch(TypeOfOuvrage){
              case 0 : clone(p); break;
              case 1 :  ((Polycopie) this).clone((Polycopie)p); break;
               ...
               }
          




          Soit dit en passant .... je te conseil plustôt de crer une fonction "clone" qui renvoit un objet Ouvrage plutôt que de modifier les attribut d'un objet déjà créé ^^

          Ouvrage o3 = O2.clone();

          ça va plus vite que ^^
          Ouvrage O3 = new Ouvrage
          o3.Clone(o2);$



          edit on va me dire que mon humour est lourd mais ton titre ^^
          Tableau de SuperClasse, remplie de filles divers
          ça fait vraiment bordel XD

          (jdm inside)
          • Partager sur Facebook
          • Partager sur Twitter
            2 janvier 2009 à 22:59:50

            Merci infiniment mon ami ; )
            • Partager sur Facebook
            • Partager sur Twitter
              3 janvier 2009 à 17:06:07

              Bonjour,

              Je suis désolé pour hier soir, je pouvais plus me reconnecter !

              Bon ben voila, Grâce à Snooooopy j'ai eu la solution a mon problème, mais avec quelque modifications que j'ai d ajouté ;)

              Voila le code finale que j'ai utilisé :

              class Ouvrage {
              	protected String code;
              	protected int TypeOfOuvrage;
              	protected boolean invoké;
              
              	public Ouvrage(){
              		TypeOfOuvrage = 0;
              		invoké = false;
              		code = "";
              	}
              	
              	public Ouvrage(String code){
              		this.code = code;;
              	}
              	
              	public String getCode(){
              		return code;
              	}
              	
              	public void setCode(String code){
              		this.code = code;
              	}
              	public String toString(){
              		return code;
              	}
              	
              	public void clone(Ouvrage o){
              		setCode(o.code);
              		switch(TypeOfOuvrage){
              	    	case 0 : break;
              	    	case 1 : invoké = true; ((Polycopie) this).clone((Polycopie) o); break;
              	    	case 2 : invoké = true; ((Revue) this).clone((Revue) o); break;
              	    }
              	}
              }
              
              class Polycopie extends Ouvrage {
              	String filière;
              	
              	public Polycopie(){
              		super();
              		TypeOfOuvrage = 2;
              		filière = "";
              	}
              	
              	public Polycopie(String code, String filière){
              		super(code);
              		TypeOfOuvrage = 2;
              		this.filière = filière;
              	}
              	
              	public String getFilière(){
              		return filière;
              	}
              	
              	public void setFilière(String filière){
              		this.filière = filière;
              	}
              	
              	public String toString(){
              		return "Polycopie : "+super.toString()+" "+filière;
              	}
              	
              	public void clone(Polycopie p){
              		if(!invoké)
              			super.clone(p);
              		setFilière(p.filière);
              	}
              }
              
              class Revue extends Ouvrage {
              	int parution;
              	
              	public Revue(){
              		super();
              		parution = null;
              	}
              	
              	public Revue(String code);
              		this.parution = parution;
              	}
              	
              	public Date getParution(){
              		return parution;
              	}
              	
              	public void setParution(int parution){
              		this.parution.clone(parution);
              	}
              	
              	public String toString(){
              		return "Revue : "+super.toString()+" "+parution;
              	}
              	
              	public void clone(Revue r){
              		if(!invoké)
              			super.clone(r);
              		setParution(r.parution);
              	}
              


              et Puis dans le Main :

              Ouvrage[] T1 = new Ouvrage[2];
              Ouvrage[] T2 = new Ouvrage[2];
              
              T1[0] = new Polycopie("M33/acx","MIP");
              T1[1] = new Revue("M33/acx",1987));
              
              for(int i=0;i<2;i++){
              	T2[i] = (T1[i].TypeOfOuvrage==0 ? new Ouvrage() : (T1[i].TypeOfOuvrage==1 ? new Polycopie() : new Revue()));
              	T2[i].clone(T1[i]);
              }
              
              for(int i=0;i<2;i++)
              	System.out.println(T1[i]);
              
              System.out.print("\n");
              
              for(int i=0;i<2;i++)
              	System.out.println("Clone "+T2[i]);
              


              Ce qui affiche bien :

              Polycopie : M33/acx 1987
              Revue : A32/bet 2000
              
              Clone Polycopie : M33/acx 1987
              Clone Revue : A32/bet 2000

              • Partager sur Facebook
              • Partager sur Twitter

              Héritage : Tableau de SuperClasse, remplie de filles divers

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown