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 :

instanceof et héritage


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Par défaut instanceof et héritage
    Bonjour à tous,

    La réponse est peut-être toute simple mais là je bloque.

    J'ai une classe C qui extends une classe B et la classe B extends la classe A

    Si je crée un objet Pourquoi (c instanceof A) me retourne false et comment tester que c hérite de A (du fait qu'il est une instance de B qui hérite de A) ?

    Merci d'avance pour votre aide !

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Salut,

    Tu peux faire:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    A.class.isAssignableFrom(c);

    Si je peux me permettre, pourquoi as-tu besoin de tester le type de ton objet avec instanceof ?

    Dans 99% des cas, en gros à part dans la méthode equals , c'est plus une erreur de design qu'autre chose que d'utiliser du instanceof ou du isAssignableFrom.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Par défaut
    Citation Envoyé par bulbo Voir le message
    Salut,

    Tu peux faire:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    A.class.isAssignableFrom(c);

    Si je peux me permettre, pourquoi as-tu besoin de tester le type de ton objet avec instanceof ?

    Dans 99% des cas, en gros à part dans la méthode equals , c'est plus une erreur de design qu'autre chose que d'utiliser du instanceof ou du isAssignableFrom.

    Bulbo
    Merci pour ta réponse !
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    A.class.isAssignableFrom(c);
    fonctionne parfaitement.

    Concernant l'utilité que j'ai du instanceof, je scanne le contenu d'un JPanel et en fonction des classes des objets trouvés (CheckBox, TextField, etc.), je génère une colonne d'une base de données ayant le format correspondant...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 19
    Par défaut
    Citation Envoyé par aliasjcdenton Voir le message
    Concernant l'utilité que j'ai du instanceof, je scanne le contenu d'un JPanel et en fonction des classes des objets trouvés (CheckBox, TextField, etc.), je génère une colonne d'une base de données ayant le format correspondant...
    C'est pas très jolie niveau architectural. Ce que je te propose est la chose suivante :

    Tu crées tes propres classes héritants de tes composants Swing tel que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class MyCheckBox extends CheckBox { ... }
    class MyTextField extends TextField { ... }
    Tu peux ensuite ajouter tes composants à ton panel exactement de la même manière, grâce à l'héritage. Mais en plus de ça tu pourras créer des méthodes dédiées dans chacune de tes classes qui s'occuperont de générer la colonnes de ta base de données. Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MyCheckBox extends CheckBox
    {
      // ...
      public void generateDBColumn(....) // On peut imaginer une série d'arguments utiles
      {
        // Generation de ma column ici
      }
      // ...
    }
    ... Et comme ça tu éviteras un "gros switch" à un moment donné dans ton code afin de tester l'instance de ton objet.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par aliasjcdenton Voir le message
    Pourquoi (c instanceof A) me retourne false
    D'après ta description cela ne devrait pas être le cas...
    Tu dois avoir une erreur dans ton code !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class A { }
    class B extends A { }
    class C extends B { }
     
    public class Main {
    	public static void main(String[] args) throws Exception {
    		C c = new C();
    		System.out.println( c instanceof A );
    	}
    }
    a++

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,


    D'après ta description cela ne devrait pas être le cas...
    Tu dois avoir une erreur dans ton code !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class A { }
    class B extends A { }
    class C extends B { }
     
    public class Main {
    	public static void main(String[] args) throws Exception {
    		C c = new C();
    		System.out.println( c instanceof A );
    	}
    }
    a++
    Merci également pour ta réponse !

    J'avoue que çà m'étonne aussi que mon instanceof ne fonctionne pas. Je vais regarder mon code de plus près pour essayer de comprendre ce qu'il se passe...

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

Discussions similaires

  1. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  2. Héritage, getClass, instanceof, casting
    Par tichadok dans le forum Langage
    Réponses: 3
    Dernier message: 29/05/2008, 17h56
  3. Conception : héritage et instanceof
    Par herve91 dans le forum Langage
    Réponses: 10
    Dernier message: 05/12/2006, 17h11
  4. [Postgres] Héritage + Clés
    Par k-reen dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 21/05/2003, 16h37
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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