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 :

Portée des objets


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Par défaut Portée des objets
    Bonjour !

    J'ai une classe A qui contient un objet de la classe B
    La classe B à une méthode qui utilise l'instance de la classe A, sauf que je ne sais pas comment faire pour retrouver cette instance !

    Exemple plus concret :
    classe A : Fenetre , classe B BlocInfo:

    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
    public class Fenetre {
      BlocInfo blocInfo;
      public Fenetre () {
        blocInfo= new BlocInfo();
      }
    }
    
    public class BlocInfo{
      String caracteristique;
      public BlocInfo() {
        caracteristique="blabla";
      }
    
      public actionBlocInfo() {
        //Ici j'ai besoin d'avoir l'instance de mon objet Fenetre !
      }
    }
    Comment faire pour ma méthode actionBlocInfo ?

  2. #2
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Une solution simple :
    Tu modifies le constructeur de ta classe BlocInfo pour lui fournir la fenêtre lorsque tu l'instancies :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class BlocInfo{
      String caracteristique;
      Fenetre parent;
     
      public BlocInfo(parent) {
       this.parent = parent;
        caracteristique="blabla";
      }
     
      public actionBlocInfo() {
        //this.parent....
      }
    }
    Et d'un point de vue logique, tu considères que la fenêtre est propriétaire du bloc qui ne peut être reparenté.

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Deux façons de voir les choses :

    # façon 1 : les deux classes sont très complexes et assez indépendantes dans l'ensemble.

    Dans ce cas, il faut que tes instances de B contiennent aussi l'instance de A qui la contient. Dans les deux sens, quoi.

    Le constructeur de Fenetre deviendra quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public Fenetre () {
      blocInfo= new BlocInfo(this);
    }
    Je rappelle que du coup, pendant le constructeur de BlocInfo, on a pas fini de construire Fenetre. Le constructeur de BlocInfo doit donc prendre l'objet Fenetre, mais ne surtout pas s'en servir pour l'instant.
    C'est toujours un peu casse-gueule.

    # façon 2 : la classe B fait partie intégrante de la classe A, elle n'en est qu'une partie

    Dans ce cas, il faut déclarer la classe B à l'intérieur de la classe A. Elle aura alors accès aux membres et méthodes de A :

    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
    public class Fenetre {
      BlocInfo blocInfo;
      public Fenetre () {
        blocInfo= new BlocInfo();
      }
     
      private void faireDesTrucs() {
     
      }
     
      public class BlocInfo {
     
        public actionBlocInfo() {
          faireDesTrucs();
        }
     
      }
     
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    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 thelvin Voir le message
    Je rappelle que du coup, pendant le constructeur de BlocInfo, on a pas fini de construire Fenetre. Le constructeur de BlocInfo doit donc prendre l'objet Fenetre, mais ne surtout pas s'en servir pour l'instant.
    C'est toujours un peu casse-gueule.
    Juste pour info, on se retrouve avec le même problème "potentiel" dans la "façon 2", puisqu'au final cela a exactement le même fonctionnement (la classe interne aura en fait un constructeur avec un paramètre "Fenetre").


    a++

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Par défaut
    Merci pour vos réponses, j'ai choisi la première solution, à savoir avoir un attribut Fenetre dans mon objet BlocInfo.

    Bloc Info :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class BlocInfo{
      String caracteristique;
      Fenetre parent;
     
      public BlocInfo(Fenetre parent) {
       this.parent = parent; //Ici on passe l'objet fenetre
        caracteristique="blabla";
      }
     
      public actionBlocInfo() {
        //this.parent....
      }
    }
    ---

    Admettons que l'objet fenêtre évolue en ajoutant un objet BlocMenu qui lui aussi a besoin de l'objet fenêtre pour ses méthodes :

    Fenetre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Fenetre {
      BlocInfo blocInfo;
      BlocMenu blocMenu; //Ici mon nouvel objet
     
      public Fenetre () {
        blocInfo= new BlocInfo(this); //Le this pour avoir notre objet fenetre
        blocMenu= new BlocMenu(this);
      }
    L'objet blocMenu garde le même principe que blocInfo, avec le this de Fenetre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class BlocMenu{
      Fenetre parent2;
     
      public BlocMenu(Fenetre parent) {
       this.parent2 = parent;
      }
    }
    Par contre j'ai une question sur les étapes de construction : (lié au warning soulevé par thelvin)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Fenetre {
      BlocInfo blocInfo;
      BlocMenu blocMenu;
     
      public Fenetre () {
        blocInfo= new BlocInfo(this); 
        blocMenu= new BlocMenu(this);
      }
    à la ligne 6 : l'objet Fenetre représenté par this n'a pas encore l'info blocMenu de renseigné, il sera null ? Et donc incomplet ?

    Ps : question complémentaire : quand une mise à jour de Fenetre sera faite sur n’importe quel attribut, est ce qu'il faudra mettre à jour les attributs parent de blocInfo et blocMenu ?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par electrovolt Voir le message
    Par contre j'ai une question sur les étapes de construction : (lié au warning soulevé par thelvin)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Fenetre {
      BlocInfo blocInfo;
      BlocMenu blocMenu;
     
      public Fenetre () {
        blocInfo= new BlocInfo(this); 
        blocMenu= new BlocMenu(this);
      }
    à la ligne 6 : l'objet Fenetre représenté par this n'a pas encore l'info blocMenu de renseigné, il sera null ?
    Oui. Valeur par défaut des variables objets.

    Citation Envoyé par electrovolt Voir le message
    Et donc incomplet ?
    Ben, on peut dire ça, oui, vu qu'à la fin du constructeur de Fenêtre, blocMenu n'est pas null.

    Citation Envoyé par electrovolt Voir le message
    Ps : question complémentaire : quand une mise à jour de Fenetre sera faite sur n’importe quel attribut, est ce qu'il faudra mettre à jour les attributs parent de blocInfo et blocMenu ?
    Non, l'objet Fenetre et les variables parent des objets qu'il contient, sont tous un seul et même objet. Modifier cet objet quelque part, le modifie partout, puisque c'est le même.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2012
    Messages : 24
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Fenetre {
      BlocInfo blocInfo;
      BlocMenu blocMenu;
     
      public Fenetre () {
        blocInfo= new BlocInfo(this); //l'objet Fenetre représenté par this n'a pas encore l'info blocMenu de renseigné
        blocMenu= new BlocMenu(this);
      }
    Pour résumer :
    En fait le this permet de passer l'adresse mémoire de l'objet, et donc a chaque modification qui se passe dans la classe Fenetre les attributs "parent" des objets BlocInfo et BlocMenu seront automatiquement mis à jour.

    Si c'est correct :
    - Lorsque la ligne 7 sera exécutée : l'attribut "parent" de BlocInfo contient un blocMenu renseigné automatiquement.
    - Que l'on modifie des infos directement dans l'objet Fenetre, dans l'attribut "parent" de BlocInfo ou l'attribut parent2 de BlocMenu -> le contenu de l'objet Fenetre sera modifié partout.

    Vous confirmez ?

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

Discussions similaires

  1. Portée des objets
    Par kaul128 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/12/2014, 22h26
  2. La portée des objets
    Par bibim dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 31/01/2012, 15h40
  3. Élargir la portée des objets en VBA
    Par Vincent3004 dans le forum Général VBA
    Réponses: 3
    Dernier message: 26/12/2010, 16h56
  4. Portées des propriétés-Relations entre objets
    Par Marmounet dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 25/09/2008, 10h40
  5. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 17h18

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