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 :

Déleguer à un objet l'implémentation d'une interface


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut Déleguer à un objet l'implémentation d'une interface
    Bonjour
    J'ai
    - une interface MyInterface,
    - un objet de type MyObjet1 qui possede une propriété de type MyObjet2
    Pour les besoins de la cause MyObjet1 doit être déclaré comme implémentant MyInterface alors que en pratique c'est sa propritété MyObjet2 qui implémente effectivement MyInterface.
    Ma question est : est-il possible de déléguer à MyObjet2 l'implementation de MyInterface tout en conservant la déclaration "MyObjet1 implements MyInterface"
    Je sais ...c'est un peu tordu comme construction...
    Merci de votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 847
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Aucun probleme. En quoi cela aurait-il pu etre genant ?

  3. #3
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par bouye Voir le message
    Aucun problème. En quoi cela aurait-il pu être gênant ?
    Sais-tu si c'est possible de le faire en java...Je débute en java(Je viens du monde delphi et je le fais assez couramment sous delphi). Je n'ai pas encore trouvé de doc qui explique comment faire en java...
    Merci

  4. #4
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Personnellement je trouve cela très bizarre comme conception...pourquoi ce ne serait pas MyObjet2 qui implémenterait MyInterface ?

    Si une classe est déclarée comme implémentant une interface, elle doit obligatoirement implémenter les méthodes de cette interface, SAUF si cette classe est abstraite. Dans ce cas ce seront les classes non abstraites héritant de cette classe abstraites qui devront implémenter les méthodes de l'interface.

  5. #5
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par CheryBen Voir le message
    Personnellement je trouve cela très bizarre comme conception...pourquoi ce ne serait pas MyObjet2 qui implémenterait MyInterface ?

    Si une classe est déclarée comme implémentant une interface, elle doit obligatoirement implémenter les méthodes de cette interface, SAUF si cette classe est abstraite. Dans ce cas ce seront les classes non abstraites héritant de cette classe abstraites qui devront implémenter les méthodes de l'interface.
    MyObjet1 implémente déjà plusieurs interfaces en plus de ses méthodes propres. Je ne veux pas avoir à gérer 150.000 lignes de code dans un même fichier mais encapsuler le plus possible dans des classes/fichiers dédiés aux différents traitements.

  6. #6
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Dans ce cas pourquoi déclarer MyObjet1 implémentant MyInterface?
    C'est cette contrainte "Pour les besoins de la cause" qui fait que tu as un problème.

    Pour que tout soit plus clair, comme tu le dis, c'est MyObjet2 qui devrait implémenter MyInterface.

  7. #7
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 847
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    MyObjet1 et MyObjet2 implementent tous les deux MyInterface, MyObjet1 delegue a MyObjet2, MyObjet2 contient l'implementation concrete du traitement, il n'y a absolument rien de bizarre dans cette construction. Au contraire c'est une bonne utilisation du principe de la Delegation, voir meme ca ressemble a un debut de Decorateur (m'enfin, tous les flux fonctionnent de cette maniere ! )

  8. #8
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par bouye Voir le message
    MyObjet1 et MyObjet2 implementent tous les deux MyInterface, MyObjet1 delegue a MyObjet2, MyObjet2 contient l'implementation concrete du traitement, il n'y a absolument rien de bizarre dans cette construction. Au contraire c'est une bonne utilisation du principe de la Delegation, voir meme ca ressemble a un debut de Decorateur (m'enfin, tous les flux fonctionnent de cette maniere ! )
    Merci pour ces infos/remarques. Si il est possible de le faire en java, quelle serait alors la syntaxe à utiliser?
    @++

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 847
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ben... aussi simplement que ca...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Interface MyInterface {
      /**
       * Do SOMETHING!
       */
      public void truc();
    }
    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 MyObject1 implements MyInterface {
      /**
       * Object to which we delegate the task.
       */
      private MyInterface delegated = new MyObject2();
     
      /**
       * {@inheritDoc}
       */
      public void truc() {
        delegated.truc();
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MyObject2 implements MyInterface {
      /**
       * {@inheritDoc}
       */
      public void truc() { 
        [...]
      }
    }

  10. #10
    Membre habitué Avatar de samaury
    Homme Profil pro
    Chevalier Jedi
    Inscrit en
    Mars 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Chevalier Jedi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2008
    Messages : 114
    Points : 141
    Points
    141
    Par défaut
    Citation Envoyé par bouye Voir le message
    Ben... aussi simplement que ca...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public Interface MyInterface {
      /**
       * Do SOMETHING!
       */
      public void truc();
    }
    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 MyObject1 implements MyInterface {
      /**
       * Object to which we delegate the task.
       */
      private MyInterface delegated = new MyObject2();
     
      /**
       * {@inheritDoc}
       */
      public void truc() {
        delegated.truc();
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MyObject2 implements MyInterface {
      /**
       * {@inheritDoc}
       */
      public void truc() { 
        [...]
      }
    }
    Effectivement ça parait évident je te remercie.
    Je m'attendait quelque chose un peu comme dans delphi/pascal qui fait que une fois que on a déclaré (dans MyObjet1)
    ".... delegated : MyInterface;implements MyInterface..."
    on n'a plus besoin d'implémenter "truc()" dans MonObjet1 mais l'appel de "truc()" est automatiquement redirigé vers "delegated.truc()"
    Merci encore
    @++

  11. #11
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 847
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Non, ce genre de constructions automatiques n'existe pas dans Java (a proposer pour Java 8 ?).

  12. #12
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour a tous,

    Un petit grain de sel pour pimenter la discussion et pousser à de bonnes pratiques
    Plutôt que d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private MyInterface delegated = new MyObject2();
    Il me semble plus souple d'appliquer l'Inversion de Contrôle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private MyInterface delegated;
     
      public MyInterface getDelegated()
      {
        return delegated;
      }
      public void setDelegated(MyInterface delegated)
      {
        this.delegated = delegated;
      }
    et ainsi permettre à un conteneur extérieur d'injecter une implémentation concrète qui pourra ainsi facilement evoluer voire changer au cours du temps sans affecter le code de MyObject1.

    Hope this helps
    Ticker

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 847
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Pourquoi pas... mais a-t-il besoin de le faire dans son contexte ?
    Car franchement, de meme qu'on ne change pas le flux sous-jacent d'une flux decore*, il n'a peut-etre pas du tout besoin de faire ce genre de chose.

    *Qui aurait l'idee de changer le flux destination d'un BufferedOutputStream en plein milieu d'une operation IO ????????

    Un autre exemple : dernierement j'avais besoin d'une Shape qui ait un fonctionnement similaire a Area mais avec le comportement de RectangularShape (setFrameFromCenter() etc). Or bizarrement Area n'etend pas RectangularShape (etonnant vu qu'Area est une Shape et donc dispose d'une methode getBounds() et getBounds2D() qui retournent... les rectangles englobants de la forme...).

    Enfin bref, ma RectangularArea etend RectangularShape et delegue tout le boulot a une Area tout en reprenant une signature similare pour faire des operations arithmethiques que les formes et les aires. A AUCUN moment je n'ai besoin de mofidier l'objet delegue ni le veux le faire. Ma classe a moi implemente Shape et c'est suffisant pour l'utiliser dans un contexte graphique, de plus JE NE VEUX PAS exposer le fonctionnement interne de la classe en permettant d'acceder a l'Area qui y est contenue et la manipuler a l'exterieur pourrait mener a un defaut de synchronisation entre l'etat de la RectangularArea et l'Area sur laquelle elle delegue.

    Bref, attention a ne pas vouloir refourguer des accesseurs ou des patterns la ou il n'y en a pas besoin et la ou c'est inutile voir dangereux d'en mettre. Tout depends bien sur du contexte dans lequel ceci est utilise.

  14. #14
    Futur Membre du Club
    Inscrit en
    Février 2003
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je suis entièrement d'accord, il ne sert à rien d'exposer des classes internes dont rien ne dit qu'elles seront amenées à changer.
    Le but de ma remarque était plutot de dire qu'une instanciation "en dur" dans une classe peut être ennuyeuse lors d'un changement d'implémentation. Mais pour cela il faut avoir bien analysé ce que l'on veut faire. Ce qui rejoint ta remarque

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/10/2010, 16h33
  2. [POO] Implémenter partiellement une interface
    Par A&Z dans le forum Langage
    Réponses: 8
    Dernier message: 14/10/2008, 21h25
  3. Deux implémentations pour une interface
    Par apqmwnqmap dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 09/05/2007, 15h21
  4. Liste des implémentations d'une interface
    Par YokoSop dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2006, 23h37
  5. Réponses: 5
    Dernier message: 23/02/2006, 00h34

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