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 :

Héritage pourtant basique


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut Héritage pourtant basique
    Bonjour !!

    Les classes B, C et D héritent de la classe A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    B extends A
    C extends A
    D extends A
    Dans les classes B, C et D, j'ai une variable 'String BD' qui contient le type de BD à utiliser.

    classe B :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String BD = "informix";
    classe C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String BD = "sqlserver";
    classe D : Je voudrais faire dans la classe A qqch du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch(BD)
    {
        case 'informix':
    	dataSource = DataSourceInitialzer.getInformixDataSource();
    	break;
        case 'sqlserver':
    	dataSource = DataSourceInitialzer.getSQLServerDataSource();
    	break;
        case 'as400':
    	dataSource = DataSourceInitialzer.getAS400DataSource();
    	break;
    }
    Mais comme ça cela ne fonctionne pas : dans A, la variable BD est nulle..

    Quelqu'un peut-il me dépanner, je galère alors que ça me semble pas si dur ..

    Milles mercis d'avance !!

    Flo

  2. #2
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Pour que celà marche il faut impérativement que ta variable db existe dans la classe A.

    Mais le mieux dans ton cas serait d'avoir une méthode getDBType abstraite dans ta class A et qqu'elle soit redéfinie dans tes classes filles pour retourner le type de base de données.

    Ensuite tu pourras dans ta classe mêre effectuée les tests que tu voudras en utilisant la méthode getDBType ...

  3. #3
    Membre éclairé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 58
    Par défaut
    Je peux me tromper mais je crois qu'il n'est pas possible de faire un switch sur une String en java.
    Seul des variables de type int ou Enum peuvent etre utilisées dans un switch.

  4. #4
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par sinok
    Pour que celà marche il faut impérativement que ta variable db existe dans la classe A.

    Mais le mieux dans ton cas serait d'avoir une méthode getDBType abstraite dans ta class A et qqu'elle soit redéfinie dans tes classes filles pour retourner le type de base de données.

    Ensuite tu pourras dans ta classe mêre effectuée les tests que tu voudras en utilisant la méthode getDBType ...
    Ou encore mieux, getDataSource() (pas besoin de strings intermédiaires)

  5. #5
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par ®om
    Ou encore mieux, getDataSource() (pas besoin de strings intermédiaires)
    Effectivement ça fait plus que se défendre, enfin bon mon idée était dans la bonne direction, (mes neurones dans la mauvaise par contre)

  6. #6
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Citation Envoyé par wizaord
    Je peux me tromper mais je crois qu'il n'est pas possible de faire un switch sur une String en java.
    Seul des variables de type int ou Enum peuvent etre utilisées dans un switch.
    C'est exact, tu en te trompes pas.

    switch sur int pour jdk < 1.5
    switch sur int est Enum pour jdk >= 1.5

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Bonjour à tous !
    Merci à vous pour ces explications.
    Pas de soucis pour le switch, je ferai un if else !
    Je vais mettre en application tous vos conseils, je vous tiens au courant !!

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Me revoila.

    J'ai une nouvelle question du coup. Imaginez que j'ai une classe E qui hérite elle aussi de A mais dans laquelle je ne veux pas implémenter la classe getDBType()...
    Pourquoi ? En fait j'ai environ 80 classes à modifier du coup.. Je voudrais donc dire que si DB est null, alors DB = Oracle par exemple ..
    Mais evidemment le compilateur n'est pas d'accord....
    Quelqu'un sait comment je peux faire ?...

    Merci !!

  9. #9
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par babylone7
    Me revoila.

    J'ai une nouvelle question du coup. Imaginez que j'ai une classe E qui hérite elle aussi de A mais dans laquelle je ne veux pas implémenter la classe getDBType()
    Dans ce cas là, tu fais un niveau intermédiaire:
    MonInterface
    MonInterface2 extends MonInterface (qui définit getDBType())
    Ensuite tu hérites soit de MonInterface, soit de MonInterface2

  10. #10
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Citation Envoyé par ®om
    Dans ce cas là, tu fais un niveau intermédiaire:
    MonInterface
    MonInterface2 extends MonInterface (qui définit getDBType())
    Ensuite tu hérites soit de MonInterface, soit de MonInterface2
    A mon avis il y a une grosse confusion... Comment tu peux définir une méthode dans une interface.

    Alors je vais faire un petite précision, parce @om je pense que tu confonds tout:

    - une classe étends une autre classe.
    - une classe implémente une interface.
    - un interface étends une autre interface.

    Non tu créé une classe abstraite qui définit la méthode getDBtype();

    et dans tes implémentations tu étends cette classe abstraite...

    Mais pourquoi abstraite me direz vous si elle définit la méthode ? Ben comme ça tu ne pourras pas instancier cette classe qui ne dois pas être instanciée directement.

    A+

  11. #11
    Expert confirmé
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    BAh c'esat pas bien dûr tu fais en sorte que la méthode getDataSource (plutôt que getDBType qui n'était pas franchement top de ma part, reporte toi au message de Rom) de ta classe mère renvoie un datasource Oracle, ce qui créra un comportement par défaut. Donc si dans une classe hériatnt de A la méthode getDatasource n'est pas redéfinie, elle renverra une datasource Oracle, si elle est par contre redéfinie elle renverra une autre datasource

  12. #12
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par thibaut
    A mon avis il y a une grosse confusion... Comment tu peux définir une méthode dans une interface.

    Non tu créé une classe abstraite qui définit la méthode getDBtype();

    et dans tes implémentations tu étends cette classe abstraite...

    Mais pourquoi abstraite me direz vous si elle définit la méthode ? Ben comme ça tu ne pourra pas instancier cette classe qui ne doit pas être instanciée.

    A+
    Quand je dis "définir", ça veut dire simplement mettre la signature de la méthode dans l'interface2, et non dans l'interface1 (je me suis mal exprimé)...

    Citation Envoyé par thibaut
    Alors je vais faire un petite précision, parce @om je pense que tu confonds tout:

    - une classe étends une autre classe.
    - une classe implémente une interface.
    - un interface étends une autre interface.
    oui, merci

  13. #13
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Citation Envoyé par ®om
    Quand je dis "définir", ça veut dire simplement mettre la signature de la méthode dans l'interface2, et non dans l'interface1 (je me suis mal exprimé)...


    oui, merci
    Mais non je veux dire qu'il n'y a aucun intérêt à définir une méthode dans une interface qui étend une autre interface, ça ne va pas te définir un comportement par défaut.... Le seul moyen de définir un comportement par défaut c'est de spécifier ta méthode dans une classe.

  14. #14
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par thibaut
    Mais non je veux dire qu'il n'y a aucun intérêt à définir une méthode dans une interface qui étend une autre interface, ça ne va pas te définir un comportement par défaut.... Le seul moyen de définir un comportement par défaut c'est de spécifier ta méthode dans une classe.
    Je répondais à cette question:
    Citation Envoyé par babylone7
    Imaginez que j'ai une classe E qui hérite elle aussi de A mais dans laquelle je ne veux pas implémenter la classe getDBType()...
    Donc ça n'est pas dans A qu'il faut mettre la signature getDBType(), mais dans une sous-interface Interface2, qui sera implémentée par E...

  15. #15
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Oui mais dans une interface tu n'auras jamais un comportement par défaut, puisque une interface ne définit pas le corps de la méthode, donc par conséquent ne définit pas son comportement...

  16. #16
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par thibaut
    Oui mais dans une interface tu n'auras jamais un comportement par défaut, puisque une interface ne définit pas le corps de la méthode, donc par conséquent ne définit pas son comportement...
    Certes, mais bon s'il veut un comportement par défaut, il met une classe abstraite qui implémente Interface2...

    Sa question était ambigue, soit il veut que certaines classes n'aient pas DU TOUT de getDBType(), soit il veut que cette méthode retourne toujours un truc par défaut si elle est pas redéfinie... c'est à l'appréciation du lecteur

  17. #17
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Oui mais un niveau n'est pas nécessaire dans ce cas, voici mon idée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface DataType {
       public DataSource getDataType();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public abstract class DataTypeDflt implements DataType {
        public DataSource getDataType() {
            // Renvoyer datasource défaut pour oracle !!!
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class DataTypeOracle extends DataTypeDflt {
        // ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class DataTypeDB2 implements DataType {
         public DataSource getDataType() {
            // Renvoyer datasource DB2 !!!
        }
     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class DataTypeMySql implements DataType {
          public DataSource getDataType() {
             // Renvoyer datasource MySql !!!
         }
      }

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 214
    Par défaut
    Merci à tous, cela fonctionne très bien avec les 2 interfaces ! Mes connaissances sur l'héritage étaient drôlement rouillées !!!

    Merci !!

    Flo

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

Discussions similaires

  1. [MySQL] Une question idiote basique (j'ai pourtant lu des tutos..)
    Par PMulE dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/08/2012, 18h17
  2. Question basique sur l'héritage
    Par NejNej dans le forum Windows Forms
    Réponses: 5
    Dernier message: 24/03/2010, 09h57
  3. [Postgresql]Héritage
    Par lheureuxaurelie dans le forum PostgreSQL
    Réponses: 13
    Dernier message: 02/10/2008, 09h18
  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