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 :

Probleme Heritage = StackOverflowError


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Inscrit en
    Décembre 2006
    Messages
    264
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 264
    Par défaut Probleme Heritage = StackOverflowError
    Bonjour,

    Je suis en train de développer une application qui duplique une base de données. J'ai un problème avec l'héritage.
    3 classes : Database, Table1 et Table2.
    variables de Database : url, login et password
    Autre variables de Database : matable1, matable2
    Table1 et Table2 hérite de Database pour accéder aux variables url, login et password.

    Code de Database :
    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
     
    public class Database {
     
        protected String url;
        protected String login;
        protected String password;
        private Table1 matable1;
        private Table2 matable2;
     
        public Database() {
            this ("", "", "");
        }
     
        public Database(String url, String login, String password) {
            this.url = url;
            this.login = login;
            this.password = password;
            matable1 = new Table1();
            matable2 = new Table2();
        }
    Code de Table1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Table1 extends Database {
        public Table1() {
            super ();
        }
    J'ai un problème de StackOverflowError. Je pense que le problème est du à une trop grande récursivité entre Table et Database. En gros, une boucle infinie. C'est un problème de conception mais je ne vois pas d'ou vient le problème.
    Ce que je souhaite juste c'est que depuis une table on puisse accéder aux informations de connexion et que quand on créé une database, que l'on créé les variables matable1 et matable2.
    J'espère m'être fait comprendre !
    Je sais que je ne suis pas obligé de mettre en place l'héritage dans ma solution mais je souhaiterais comprendre. Mais peut_être que je ne peut tout simplement pas mettre en place l'héritage ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Pour l'explication:

    ton objet "DataBase" contient un objet "Table1" initialisé par le constructeur
    l'objet "Table1" étend "Database": il contient donc par héritage un objet "Table1", qui lui même contient un objet "Table1"... et ce à l'infini.

    Donc à l'appel du constructeur:

    - appel au constructeur de Database
    - celui-ci appelle le constructeur de Table1
    - celui-ci appelle le constructeur parent (Database)
    - ce dernier appelle un nouveau constructeur de Table1
    - etc.

    Donc oui, tu as bien un problème de conception et de boucle infinie... et je ne vois pas ce que tu ne comprends pas
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2006
    Messages
    264
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 264
    Par défaut
    Ce que je veux faire c'est crée une variable Database. Quand je la créé, elle me créé 2 variables matable1 et matable2. Je veux que ces deux variables puissent accéder aux variables url, login et password de la classe Database.
    Meme si j'enleve le super dans le constructeur de Table1, j'ai toujours le meme problème. J'ai compris d'ou vient le problème mais je ne sais pas le résoudre pour arriver à ce que je veux.

    Merci

  4. #4
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Pourquoi as tu besoin de placer matable1 et matable2 dans la classe Database ? Pourquoi ne pas créer ces 2 instances en dehors de Database, là où tu en as besoin ?
    Pour accéder aux variables url, login et password de la classe Database, il suffit de prévoir des accesseurs.

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2006
    Messages
    264
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 264
    Par défaut
    Je sais que je peux passer mes instances en dehors de Database. En fait je vais avoir plusieurs instance de Database. Il est plus simple de créer une instance de Database que 6 instances Tables.
    Je pense que je vais essayer avec le système des accesseurs (enfin si j'ai bien compris ce que c'était !).
    Je dois définir une classe Parametres par exemple et une autre Classe Database. Ma classe Database crée les instances de Table1 et Table2. Dans ces deux classes Table, je fais un accès à la classe Parametres ?
    Sachant que je voudrais pouvoir modifier les parmètres, je ne pense pas que ce soit possible d'utiliser une classe Interface ?


    La question que je me pose c'est que j'ai l'impression de faire de l'heritage inversée et je ne pense pas que ce soit possible? Je me demande donc si l'heritage a lieu d'etre dans mon utilisation !

    Merci beaucoup pour votre aide. Je me débrouille en Java mais c'est vrai que j'ai du mal avec les concepts d'héritage. Donc oui je suis mauvais en Java ! C'est pour ca que je voulais essayer avec de l'héritage.

  6. #6
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par Shifty_ Voir le message
    Meme si j'enleve le super dans le constructeur de Table1, j'ai toujours le meme problème. J'ai compris d'ou vient le problème mais je ne sais pas le résoudre pour arriver à ce que je veux.
    C'est normal: le constructeur de la classe mère est appelé par défaut, même si tu ne le précises pas. Le "super()" que tu retires de ton code est donc tout de même exécuté implicitement.

    Pour ton besoin, tu n'as pas besoin d'héritage, et ce n'est d'ailleurs pas logique: une table n'est pas une spécialisalisation d'une base de données. Une table appartient à une (et une seule) base de données, qui contient de 0 à n tables.

    A partir de là, tu construit le diagramme UML représentant ça, que tu traduis en code java objet, ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Database {
       private List<Table> tables = null;
       // ...
    }
     
    class Table {
       private Database database = null;
       // ...
    }
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2006
    Messages
    264
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 264
    Par défaut
    C'est ce que j'ai compris après. Je ne peux pas mettre en oeuvre l'héritage dans mon cas.
    Au moment de créer les tables dans la class Database, je vais juste leurs passer en paramètres les identifiants de connexion.

    Merci à tous pour vos réponses ! C'est maintenant plus clair dans ma petite tête !

    Bonne journée à tous

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

Discussions similaires

  1. probleme heritage dans 1 MCD
    Par User dans le forum Schéma
    Réponses: 5
    Dernier message: 25/04/2007, 13h39
  2. probleme heritage overriding
    Par mathieujava dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2006, 11h26
  3. Probleme heritage (debutant)
    Par pouic06 dans le forum Débuter
    Réponses: 11
    Dernier message: 18/11/2006, 07h41
  4. Probleme heritage : References sur la table parente
    Par Belgar dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 03/05/2005, 22h11
  5. probleme heritage en C#
    Par roninou dans le forum Windows Forms
    Réponses: 2
    Dernier message: 03/04/2005, 19h12

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