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 :

Cast possible dans les 2 sens?


Sujet :

Langage Java

  1. #1
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut Cast possible dans les 2 sens?
    Bonjour,

    Je sèche sur une partie de mon travail. Je dois réaliser 3applications qui communiquent entre elles en réseau. La connection,... se passe bien mais ce sont les échanges qui posent problème.

    Je m'explique: Le client doit se connecter à une banque et pour s'identifier il doit envoyer son login et mot de passe à la banque. Ce que je récupère dans l'interface graphique et je le stocke dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class SimplifiedClient{
      String name, password;
      ...
    }
    Pour l'envoi/réception, j'ai pensé bon de créer une nouvelle classe ObjNetwork:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class ObjNetwork{
      String message;
      Object obj1;
      Object obj2;
      ...
    }
    Elle s'adapterait en fonction du type d'envoi (NewClient, BuyStock, Disconnect,...) avec chaque fois les objets nécessaires.

    Donc dans le cas de la connection, je créée un ObjToSend:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    clientToto = new SimplifiedClient("Titi","12345");
    ObjToSend = new ObjNetwork("NewClient", (Object) clientToto);
    J'envoie et puis dans la banque je reçois, l'objet ObjNetwork que je traite comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    clientToto = (SimplifiedClient)objToReceive.getObj1();
    System.out.println(clientToto.getName()+" est connecté");
    Les méthodes existent bien,... mais il n'arrive pas à m'afficher le nom de clientToto. J'ai l'impression que les casts dans les deux sens font que ça foire. (SimplifiedClient -> Object -> SimplifiedClient).

    Dans la banque, je n'utilise pas de constructeur (étant donné que je caste). Faudrait-il en créé un, si oui comment?

    Autrement comment pourrais-je faire pour transiter plusieurs variables d'un coup sans pour autant créer des nouvelles classes pour chaque type de communication?

    Merci par avance pour votre aide.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Pourquoi ne pas t'inspirer de certains protocoles comme FTP ?
    Tu crées une "norme" dans laquelle tu pourras envoyer tes informations :

    Login, password, disconnect, etc..., tout peut être géré via du texte plutot que via des objets non (ce qui simplifie les envois)?

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  3. #3
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Dans mes objets, il n'y aura pas que des strings mais aussi des InetAdress, int, arraylist,...

    Le plus gros du code avec ces objets est déjà écrit. Le fait de devoir réécrire en utilisant que des strings compliquerait le tout. J'ai pris la commande la plus simple pour expliquer mon problème mais que je vais devoir envoyer un arraylist, ce ne sera pas possible.

    Avant de penser à tout réécrire avec des strings, j'aimerai savoir s'il n'y a pas moyen de le faire avec des objets. Ce serait plus simple pour moi.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 282
    Points : 327
    Points
    327
    Par défaut
    C'est peut-être un peu bête mais tu passes bien par des ObjectOutputStream ?

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu utilises les Socket ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Ouaip, j'utilise bien les Sockets, ServerSockets, ObjectOutputStream,...

    Les classes sont bien sérialisées,... Juste la dernière étape qui coince donc le cast de l'objet vers SimplifiedClient.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  7. #7
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    ton client a bien accès à la définition de l'objet en question ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Oui, la classe SimplifiedClient est identique des différents côtés (dans la banque et dans le client). Seule différence, c'est que dans le client, j'ai le constructeur du SimplifiedClient.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  9. #9
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    oui mais alors tu as une "class cast exception"
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Mmmh, il ne me dit pas ça comme cela. Mais ça doit être ça, comment puis-je lui expliquer comment caster un objet en SimplifiedClient ?
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  11. #11
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Passe par une interface commune
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre éclairé Avatar de Pollux
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    706
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Avril 2005
    Messages : 706
    Points : 680
    Points
    680
    Par défaut
    Pour que la déserialisation puisse se faire, il faut un constructeur sans argument dans ta classe. Si tu n'as mis aucun constructeur c'est bon il sera créé pour toi par le compilateur.
    Pour chaque langage existe une faq / N'oubliez pas de lire les règles du forum

  13. #13
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    L'objet SimplifiedClient dans l'application client est:
    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 SimplifiedClient  implements java.io.Serializable{
        static final long serialVersionUID = 1L;
     
        String clientName, clientPassword;
        InetAddress clientIP;
        int clientSold;
        int bankID;
     
        public SimplifiedClient(){}
     
        public SimplifiedClient(InetAddress cIP, String cName, String cPswd, int cCredit, int bID) {
            this.clientIP = cIP; 
            this.clientName = cName;
            this.clientPassword = cPswd;
            this.clientSold = cCredit;
            this.bankID = bID;
        }
     
       //méthodes
    }
    Dans la banque, j'ai exactement la même chose sauf que je n'ai pas le 2eme constructeur.

    L'ordre de déclaration des variables a-t-il de l'importance?

    Autrement, l'interface commune, je ne comprends pas comment l'implémenter, je n'ai pas encore eu l'occasion de me servir des interfaces.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Au risque de me répéter, ce ne sont pas les mêmes objets, donc problème...

    Fait un test, fournis un jar de l'objet à ton client et regarde s'il arrive à le récupérer.
    Tu peux fournir le plus complet à la "banque", tu n'as pas besoin d'utiliser ce constructeur.
    La solution "propre" serait de faire implémenter une interface commune à tes 2 objets et là, si tu cast vers l'interface, plus de problème...

    a+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    En quoi l'objet SimplifiedClient du client est-il différent de celui de la banque? Ils ont les mêmes variables, mêmes méthodes, juste un constructeur de plus dans le cas du client.

    Pourrais-tu me donner un exemple pour l'interface commune?

    Merci
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  16. #16
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    L'objet a forcément une signature différente puisque tu n'as pas les mêmes méthodes (constructeur en l'occurrence)

    Pour ce qui est de l'interface :
    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
    21
    22
    23
    24
    25
    26
     
    public interface MonInterfaceCommune
    {
       public void maMethode1(String parm1, Object parm2);
       ...
    }
     
    public class MonObjetAPartagerCoteBanque implements MonInterfaceCommune
    {
       public void maMethode1(String parm1, Object parm2)
       {
          ... le traitement ...
       }
    }
     
    public class MonObjetAPartagerCoteClient implements MonInterfaceCommune
    {
       public void maMethode1(String parm1, Object parm2)
       {
          ... le traitement ...
       }
    }
     
    // Après pour la récupération...
     
    MonInterfaceCommune monObjetPartage = (MonInterfaceCommune)objToReceive.getObj1();
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  17. #17
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    J'aurai toujours mes différents constructeurs, non?

    Puisque l'interface peut contenir uniquement des définitions de méthodes et des valeurs constantes et non des valeurs non-constantes, ni des constructeurs.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  18. #18
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Si tu veux...
    C'est un peu comme si tu voyais l'objet sous une forme "comportementale" plutôt que sous la forme d'une instance bien précise d'un objet...

    (c'est pas très beau comme terme, mais c'est relativement explicite)

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Ce qu'on te propose en fait, c'est d'utiliser une méthode qui s'appelle le polymorphisme.
    Quel que soit l'objet qui découle de ton interface, il devra suivre le contrat de cette interface : memes méthodes (et pas forcément mêmes constructeurs) entre autres.

    Donc tes deux clients peuvent déscendre de la même interface, ce qui te permet de pouvoir avoir un constructeur dans l'un et pas dans l'autre.

    Apres, au lieu de caster en client, tu cast en interface, et tu appelle les méthodes. Java se débrouillera tout seul pour aller chercher la bonne methode selon la classe qu'il aura, mais toi tu t'en fiche, tu appelles les méthodes sur une interface.

    Pour te donner un exemple, supposons une interface Voiture qui a une methode accelerer().
    Deux classes Clio et Twingo descendent de Voiture, donc doivent redéfinir cette méthode accelerer() pour coller au contrat de l'interface.
    Maintenant, si je récupere une voiture, et que je ne sais pas si c'est une Twingo ou une Clio, je la récupère sous la forme d'une Voiture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Voiture maVoitureInconnue=getVoiture();
    Or, peu importe la voiture que j'aurai récupéré, je peux accélerer avec, donc appeller la méthode accelerer(), et ce même si elles ne sont pas construites de la même façon. C'est le même principe avec tes clients

    Fred
    Développeur Java / Flex à Shanghai, Chine
    mes publications
    Mon dernier tutoriel : Messages Quit IRC : explications

    La rubrique IRC recrute des redacteurs : contactez moi

    Ce flim n'est pas un flim sur le cyclimse. Merci de votre compréhension.[/SIZE]

  20. #20
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Merci à vous pour vos explications, je vais essayer ça, je vous tiens au jus.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

Discussions similaires

  1. [Oracle 8i] Jointure externe dans les deux sens
    Par Drizzt [Drone38] dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/09/2006, 15h10
  2. [XSL~FO][FOP] variables possibles dans les attributs de tags ?
    Par lebechen dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 29/06/2006, 09h17
  3. [SQL] Jointure externe dans "les 2 sens"
    Par Bounty Killer dans le forum Oracle
    Réponses: 3
    Dernier message: 04/05/2006, 10h56
  4. Double HashMap (Parcours dans les deux sens)
    Par Graffity dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/02/2006, 11h02
  5. Association navigables dans les deux sens
    Par DarkNagash dans le forum Diagrammes de Classes
    Réponses: 4
    Dernier message: 13/07/2005, 15h11

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