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 :

Appel d'un constructeur à partir d'un autre


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut Appel d'un constructeur à partir d'un autre
    Salut!

    Dans une classe j'ai deux constructeurs:
    -un qui prend en parametre un tableau de type "double[][]" et le converti en "ArrayList".
    -un qui prend en parametre un nom de fichier et en extrait les données qu'il stocke dans un tableau de type "double[][]".

    Ce qu'il faudrait c'est que après avoir fait le tableau le 2ème constructeur fasse appel au 1er pour le convertir en "ArrayList", le 2ème ne faisant que "préparer le terrain".

    Mais:
    à la fin du 2ème constructeur donne l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The method LaClasse(double[][]) is undefined for the type LaClasse
    Est-il possible d'appeler un constructeur à partir d'un autre?
    Si oui quelle est la procédure à suivre?

    Merci de votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Par défaut
    Pour appeler un constructeur apartir d un autre if faut utiliser le mot cle this. et par exemple tu devras faire this(double[][]).
    Mais si je ne me trompe pas, il faut que cet appel soit la premiere instruciton dun constructeur pour qu elle puiss entre utilisee.
    Pour quoi ne pas mettre le code qui effectue la transformation dans une methode qui effectue la transformation que tu appellerais depuis le constructeur directement au lieu de passer par des appel de differents constructeurs? Ca serait peut etre plus simple

  3. #3
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    il faut que cet appel soit la premiere instruciton dun constructeur pour qu elle puiss entre utilisee.
    Je m'en suis aperçu à mes dépends.
    Pour quoi ne pas mettre le code qui effectue la transformation dans une methode qui effectue la transformation que tu appellerais depuis le constructeur directement au lieu de passer par des appel de differents constructeurs? Ca serait peut etre plus simple
    Sûrement mais je me demandais si je pouvais le faire sans réorganiser le code.
    De plus il faut bien 2 constructeurs distincts.
    J'avais pensé à "alléger" les constructeurs afin qu'il se contentent de faire appel aux méthodes qui effectueront l'initialisation effective des données.

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Pour l'instant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /*Constructeur avec tableau*/
    LaClassse(double[][] tab){
    initArrayList(tab);
    }
    /*Constructeur avec fichier*/
    LaClasse(String filePath){
    ...
    initArrayList(tab);
    }
    void initArrayList(double[][] tab){
    ...
    }
    qui marche parfaitement.

    Sinon question subsidiaire:
    peut-on définir les méthodes d'une classe en dehors de celle ci comme en C++?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Par défaut
    arghhhhhh vient pas dire ca ici ....

    en java tout ce qui compose une classe est code dans la classe.

    Tu peux faire des classes abstraites dont les methods abstraites seront obligatoirement implementees par les sous classes qui la derive, ou des interfaces qui declarent des methodes que les classes qui les implementent devront implementer mais sinon NON, il n est pas possible, en tout cas pas que je sache ...

  6. #6
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    > peut-on déclarer les méthodes d'une classe en dehors de celle ci comme en C++?

    on peut faire ca en C++?
    je croyais que la declaration de toute les methodes d'une classe etait obliger d'etre dans le .h ou .hpp
    et l'implementation d'un un fichier .C ou .CPP. (ou dans le .h/hpp mais souvent on divise)?

    ca a changer?
    on peut definir une methode d'une classe dans une autre classe?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Par défaut
    je pense que pour lui les mettre dans le .h ou .hpp c etait les mettre en dehors de la classe

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    on peut faire ca en C++?
    ca a changer?
    A priori non c'est moi qui écrit des conneries.
    Je veux dire DEFINIR.

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /*Constructeur avec tableau*/
    LaClassse(double[][] tab){
    initArrayList(tab);
    }
    /*Constructeur avec fichier*/
    LaClasse(String filePath){
    ...
    initArrayList(tab);
    }
    void initArrayList(double[][] tab){
    ...
    }
    ça marche parfaitement, mais il n'est pas prudent d'appeler les méthodes non-statiques d'une classe dans un constructeur de cette même classe. Les méthodes non-statiques sont en effet susceptible d'accéder à des variables d'instance dont c'est le rôle du constructeur de les initialiser ...
    Dans ton cas, étant donné qu'il n'est pas possible de déduire le chemin d'accès à partir du tableau ni inversement, sans quoi tu aurait uniquement recouru à la surcharge de constructeur, le mieux est donc de factoriser le code commun aux deux constructeurs dans une méthode statique. Ca ne change rien en l'état mais c'est plus propre.


    Sinon question subsidiaire:
    peut-on définir les méthodes d'une classe en dehors de celle ci comme en C++?[/QUOTE]

    En C++, la déclaration des prototypes de méthodes et de classes oblige à utiliser un fichier d'entêtes, et donc de jongler avec deux fichiers pour écrire une seule classe, sauf pour les classes template. Je préfère largement la façon dont on organise le code en Java qui permet d'avoir une vue d'ensemble de sa classe dans un seul fichier.

  10. #10
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    non, ce n'est pas Eclipse, mais Java qui impose une seule classe publique par fichier.
    C'était le:
    autant de classe non public que l'on veut.
    qui fait oublier le fait qu'il faut une classe par fichier.

    c'est le rôle du constructeur de les initialiser ...
    En fait c'est ma fonction qui fait office de "constructeur" en initialisant les données.
    Les vrais constructeurs se contentent de faire appel à cette fonction.
    une méthode statique
    Pourquoi static?

  11. #11
    Membre éprouvé Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Par défaut
    Oui c'est possible avec le mot clé "this", par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    MaClasse(A a, B b) {
       this(a);
       ...
    }
    MaClasse(A a) {
       ...
    }

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

Discussions similaires

  1. Appel d'un constructeur à partir d'un autre constructeur
    Par moineauacoustic dans le forum Langage
    Réponses: 6
    Dernier message: 11/08/2014, 19h00
  2. Appel d'un projet à partir d'un autre
    Par kazhar dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/02/2007, 10h16
  3. comment appeler une requete a partir d'une autre ?
    Par DjBeGi dans le forum Access
    Réponses: 2
    Dernier message: 01/06/2006, 14h39
  4. Pb d'appel d'objet a partir d'un autre objet
    Par sebastien2222 dans le forum Langage
    Réponses: 11
    Dernier message: 31/05/2006, 09h49

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