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 :

Suis-je face à un problème de downcasting?


Sujet :

avec Java

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut Suis-je face à un problème de downcasting?
    Je cherche à améliorer mes compétences en débugage et je me suis donc pris des exercises ou un code à été explicitement mal programmé pour réviser des notions. Le voici:

    Code java : 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
     
    public class Test{
        public static void main(String[] args){
     
            Vehicule t1 = new Tourisme(10);
        }
    }
     
    class Transport{
    	int no;
    	Transport(int n){
    		no=n;
    	}
    }
     
    class Vehicule extends Transport{
    	int puissance;
    	Vehicule(int p){
    		puissance=p;
    	}
    }
     
    class Tourisme extends Vehicule{
    	String marque;
    	Tourisme(String marque, int p, int n){
    		this.marque=marque;
    		super(p);
    	}
    }

    Je pense qu'il y a un certain manque d'arguments dans la mesure ou le constructeur de Tourisme prend trois arguments. Deplus un Vehicule ne peut pas être un Tourisme, il peut seulement être un Transport ou un Vehicule.
    Du coup j'écrirais plutôt:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Test{
        public static void main(String[] args){
     
            Vehicule t1 = new Transport(10);
        }
    }

    Mais Eclipse n'est pas content...
    Qu'est ce que je loupe? Je suis ok pour des indices si vous pensez que ça peut m'aider à progresser?

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si, bien sûr, un variable de type Vehicule peut contenir une référence d'objet de type Tourisme. Simplement, on ne pourra pas appeler les méthodes de la classe Tourisme par la variable t1. C'est comme quand on écrit Number n = new BigInteger("42"); : on peut écrire ça, mais on ne peut pas appeler n.signum(); par exemple.

    Il y a plusieurs erreurs dans le code :
    1. le constructeur de Vehicule n'appelle pas le constructeur de Transport (obligatoire) ;
    2. le constructeur de Tourisme ne peut pascompiler : on ne peut pas mettre de code avant l'appel du constructeur de la classe parent (super(...)) ;
    3. tu l'avais vu : le manque d'arguments pour l'instanciation de Tourisme.


    En revanche, tu ne peux pas écrire Vehicule t1 = new Transport(10);. Vehicule est plus spécifique que Transport.

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut
    D'accord, donc pour le fait qu'on ne peut pas mettre de code de la classe parent (le point 2), cela donne simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Tourisme extends Vehicule{
    	String marque;
    	Tourisme(String marque, int p, int n){
                    super(p);
    		this.marque=marque;
     
    	}
    }
    et pour le point 1, mais je ne suis pas sûr, le Constructeur de la classe fille DOIT appeler le constructeur de la classe mère donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Vehicule extends Transport{
    	int puissance;
    	Vehicule(int p){
    		puissance=super(p);
    	}
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par AntoineCompagnie Voir le message
    D'accord, donc pour le fait qu'on ne peut pas mettre de code de la classe parent (le point 2), cela donne simplement:
    et pour le point 1, mais je ne suis pas sûr, le Constructeur de la classe fille DOIT appeler le constructeur de la classe mère donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Vehicule extends Transport{
    	int puissance;
    	Vehicule(int p){
    		puissance=super(p);
    	}
    }
    Non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Vehicule extends Transport{
    	int puissance;
    	Vehicule(int p){
    		super(0);
    		puissance=p;
    	}
    }
    J'ai mis 0 de manière arbitraire.
    J'imagine que no représente un numéro de transport.
    Lorsque tu créer un véhicule, tu ne demande que la puissance en paramètre.
    Si le véhicule est un transport et qu'un transport demande un numéro, un véhicule doit demander un numéro.
    Donc dans ce cas la, une implémentation plus logique semble etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Vehicule extends Transport{
    	int puissance;
    	Vehicule(int numero, int p){
    		super(numero);
    		puissance=p;
    	}
    }

  5. #5
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2015
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 156
    Points : 52
    Points
    52
    Par défaut
    Merci à vous deux, je pense que j'ai mieux saisi le concept de downcasting...

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

Discussions similaires

  1. [IB7.5]Je suis vraiment devant un problème bisard
    Par touhami dans le forum InterBase
    Réponses: 8
    Dernier message: 25/01/2008, 21h43
  2. Problème d'affichage de la "face arrière" d'un carré
    Par Pragmateek dans le forum DirectX
    Réponses: 2
    Dernier message: 07/07/2007, 15h52
  3. [DX9][C#] Problème couleur faces et arretes d'un cube
    Par lancer83 dans le forum DirectX
    Réponses: 3
    Dernier message: 07/07/2006, 18h59
  4. Réponses: 1
    Dernier message: 07/07/2006, 15h27
  5. Problème face transparente
    Par goutbouyo dans le forum DirectX
    Réponses: 4
    Dernier message: 28/12/2004, 23h47

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