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 :

heriter d'une classe abstraite


Sujet :

avec Java

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut heriter d'une classe abstraite
    Salut à tous,
    j'ai utilisé dans mon exemple une Interface,une classe abstraite,deux classes Golf5 et Polo6 qui heritent de cette dernière et une classe main.
    Je veux afficher l'attribut age de ces deux dernieres classes en utilisant la classe abstraite.
    l'affichage doit etre 13 et 6 mais il affiche 0 et 0
    Si vous pouvez m'aider ...
    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface VoitureImp {
    	public void demarrer();
    	public void arreter();
    	public void reparer(); 
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    public abstract class VoitureAbstr  implements VoitureImp {
     
    	public int age;
    	public abstract void arreter();
     
    	public abstract void demarrer();
     
    	public abstract void  reparer();
     
    }
    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
     
    public class Polo6 extends VoitureAbstr{
     
    	public int age=13;
    	public void arreter() {
     
    		System.out.println("Voiture Polo6 va s'arreter");
     
    	}
     
    	public void demarrer() {
    		// TODO Auto-generated method stub
    		System.out.println("Voiture Polo va demarrer");
    	}
     
    	public void reparer() {
    		// TODO Auto-generated method stub
    		System.out.println("reparer la voiture Polo6");
    	}
     
     
    }
    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
     
    import java.lang.Comparable;
    import java.util.ArrayList;
    public class Golf5 extends VoitureAbstr implements Comparable{
    	public int age=6;
     
    	public void demarrer()
    	{
    		System.out.println(" Voiture Golf5 va demarrer");
    	}
     
    	public void arreter(){
    		System.out.println("Voiture golf5 va s'arreter");
     
    	}
    	public void reparer(){
    	}
     
     
     
     
    }

    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
     
     
    import java.util.Comparator;
     
    public class ComparatorVoitue implements Comparator {
    	public int compare(Object o1, Object o2) {
    		// TODO Auto-generated method stub
    //		if(((Golf5)o1).age > ((Polo6)o2).age) return 1;
    //		else if (((Golf5)o1).age == ((Polo6)o2).age) return 0;
    //		else return (-1);
     
    		if(((VoitureAbstr)o1).age > ((VoitureAbstr)o2).age) return 1;
    		else if (((VoitureAbstr)o1).age == ((VoitureAbstr)o2).age) return 0;
    		else return (-1);
     
     
    	}
    }


    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
    32
    33
    34
    35
    36
    37
    38
     
     
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Iterator;
    public class VoituresUtiles2 {
     
    	public void reparerVoiture(VoitureAbstr v ){
    		v.reparer();	
    	}
     
    	public void arreterVoiture(VoitureAbstr v ){
    		v.arreter();	
    	}
     
    	public int getAgeVoiture(VoitureAbstr v){
    		return v.age;
    	}
    	public static void main(String args[]){
     
    		ArrayList list = new ArrayList();
    		list.add(new Polo6());
    		list.add(new Golf5());
    		Comparator c = new ComparatorVoitue();
    		Collections.sort(list, c);
     
    		Iterator it = list.iterator();
    		while(it.hasNext())
    		System.out.println("age des voitures"+(((VoitureAbstr)it.next()).age));
     
    		//for(int i = 0 ; i <list.size();i++ )
    		//	System.out.println(list.size());
    	}
     
     
    }
    merci d'avance

  2. #2
    Membre régulier Avatar de kaizokuni
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 83
    Points : 95
    Points
    95
    Par défaut
    Salut,
    une première chose qui manque, dans ta classe Golf5 tu doit implementer la methode compareTo(object) de l'interface Comparable ou déclarer Golf5 comme étant une classe abstraite (ce n'est pas ton but)

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 85
    Points : 68
    Points
    68
    Par défaut
    Salut,

    A confirmer par un expert mais a mon avis c'est que tu appelle l'attribut 'a' de la classe abstraite lorsque tu fais ((VoitureAbstr)it.next()).age. Les attributs ne sont pas virtuel il me semble donc tu ne peux pas utilisé le polymorphisme avec. Passe par une méthode (un getter) qui te retourne l'attribut age.

  4. #4
    Membre régulier Avatar de kaizokuni
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 83
    Points : 95
    Points
    95
    Par défaut
    Tu doit rajouter dans ta classe abstraite un getter que tu implémentera dans Golf5 et Polo6

    VoitureAbstr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public abstract class VoitureAbstr  implements VoitureImp {
     
    	public int age;
    	public abstract void arreter();
    	public abstract void demarrer();
    	public abstract int getAge();
    	public abstract void  reparer();
     
    }
    Rajouter dans Polo6 et Golf5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public int getAge(){
       return age;
    }
    Modifer VoituresUtiles2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while(it.hasNext())
    		System.out.println("age des voitures"+(((VoitureAbstr)it.next()).getAge()));

  5. #5
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    je ne suis pas d'accord avec toi kaizokuni pour dire que "getAge" doit être implémenté dans Polo6 et Golf5.

    Le principe de la surcharge est de justement pouvoir redéfinir ce qui diffère or la méthode "getAge" est identique dans les deux cas.

    Elle doit donc être définit par la classe abstraite "VoitureAbstr"
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre régulier Avatar de kaizokuni
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 83
    Points : 95
    Points
    95
    Par défaut
    certes, t'as raison concernant la surcharge, mais dans le cas de keweed, pour appliquer ce que tu dit, il faudrait que l'attribut age soit intialiser (lors du new ou avec un setter) dans VoitureAbst (ce qui est plus logic d'ailleurs), or la si on implemente getAge dans voitureAbst, la valeur retourné sera la valeur d'initialisation par default d'un int qui est 0

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Ok pour moi je vois les choses comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public interface VoitureImp {
    	public void demarrer();
    	public void arreter();
            public int getAge();
    	public void reparer(); 
    }
    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
    public abstract class VoitureAbstr  implements VoitureImp {
     
    	private int age;
    
            public VoitureAbstr(int sonAge) {
                 this.age = sonAge;
            }
    	public abstract void arreter();
     
    	public abstract void demarrer();
     
    	public abstract void  reparer();
    
            public int getAge(){
                return age;
            }
    }
    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
    public class Polo6 extends VoitureAbstr {
    	
            public Polo6() {
               super(13);
            }
    	public void arreter() {
     
    		System.out.println("Voiture Polo6 va s'arreter");
    		
    	}
     
    	public void demarrer() {
    		// TODO Auto-generated method stub
    		System.out.println("Voiture Polo va demarrer");
    	}
     
    	public void reparer() {
    		// TODO Auto-generated method stub
    		System.out.println("reparer la voiture Polo6");
    	}	
    }
    il faut faire la même chose avec Golf5.

    Ensuite il faut effectivement appeler getAge pour avoir l'age de la voiture
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre habitué Avatar de jean.2edi
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 106
    Points : 131
    Points
    131
    Par défaut
    Je suis d'accord, si on veut faire propre :
    • L'attribut age est privé (comme tous les attributs).
    • Le getter age est public mais implémenté dans la classe abstraite.
    • Il est possible de ne pas donner de valeur à l'âge dans le constructeur avec l'utilisation d'un setter...

    Si une autre voiture a sa propre gestion de l'age, elle surchargera le getter et aura à gérer l'attribut ou son remplacement par autre chose...

    Il faut bien ranger tout le code :
    • L'interface dit ce que fait une voiture (donner son age, démarrer, stopper...).
    • La classe abstraite implémente l'interface et contient tout ce qui est commun aux vraies voitures.
    • Les classes de voiture ne contiennent que ce qui est propre à chaque voiture : elles peuvent même ne contenir qu'un constructeur !

Discussions similaires

  1. "Instancier" une classe abstraite
    Par alex6891 dans le forum Langage
    Réponses: 5
    Dernier message: 03/05/2006, 10h56
  2. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  3. Réponses: 2
    Dernier message: 27/03/2005, 16h09
  4. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 15h05
  5. Réponses: 13
    Dernier message: 02/02/2005, 00h21

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