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

Windows Forms Discussion :

[C#][code] Utilisation des interfaces


Sujet :

Windows Forms

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut [C#][code] Utilisation des interfaces
    Bonjour !!
    Je viens de découvrir les interfaces. Mai sje ne suis pas sur de savoir les manipuler convenablement.

    J'ai fait cette classe user:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    public interface Iuser
    {
        string U_LOGIN { get;}
        string U_SID { get;}
        string U_PORT { get;}
    }
     
    public class user : Iuser
    {
     
        private string _login = "";
        private string _sid = "";
        private string _port;
     
        public user(string login)
        {
            U_LOGIN = login;
            U_SID = this.CreateEnvironment(U_LOGIN);
            U_PORT = this.GetPort(U_LOGIN);
        }
     
        public string IAmConnected()
        {
    ...
    ...
        }
     
        private string CreateEnvironment(string login)
        {
    ...
    ...
            }
     
         private string GetPort(string login)
        {
     ...
     ...
        }
     
        //Accesseur
        public string U_LOGIN
        {
            get { return this._login; }
            private set { this._login = value; }
        }
        public string U_SID
        {
            get { return this._sid; }
            private set { this._sid = value; }
        }
        public string U_PORT
        {
            get { return this._port; }
            private set { this._port = value; }
        }
     
    }
    je voudrais donc savoir si c'est la bonne manière de procédé.
    Est-ce qu'à l'intérieur dans l'interface, on peut rajouter le mot clé set pour une variable.
    Ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public interface Iuser
    {
        string U_LOGIN { get;set;}
    ...
    }
    Dans ce cas, aux vues de la classe user et de l'accesseur pour U_LOGIN, seul la classe user elle même peut "setter" cette variable ??
    Donc, aucun intérêt de mettre set dans la définition de U_LOGIN pour l'interface ...
    Je me trompe ???

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Une interface sert à définir un contrat, un ensemble de règles que ta classe se devra d'implémenter pour être opérationnelle.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Bonjour Morpheus,
    J'avais cru comprendre que l'interface était une sorte de "d'image" (une "vitrine") d'une classe qui pouvait être passé à un contructeur d'une autre classe afin d'avoir accès à certaines variables définie dans cette classe. Je me trompes ?
    Est-ce cela que tu entends par contrat ?

  4. #4
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Oui biensure tu peux ajouter set dans U_LOGIN. Le fait de mettre un setter dans l'interface pour le variable U_LOGIN oblige chaque classe qui implemente l'interface en question (Iuser) de definir un setter pour U_LOGIN. c'est tout l'interet des interfaces, definir des comportements personnallisables pour chaque classe qui l'implemente.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Citation Envoyé par mehdi_tn
    Oui biensure tu peux ajouter set dans U_LOGIN. Le fait de mettre un setter dans l'interface pour le variable U_LOGIN oblige chaque classe qui implemente l'interface en question (Iuser) de definir un setter pour U_LOGIN. c'est tout l'interet des interfaces, definir des comportements personnallisables pour chaque classe qui l'implemente.
    ok, si je mets un set pour U_LOGIN dans la définition de l'interface lors de l'imémentation de la classe, je serai obligé de définir la variable.
    Mais si je ne mets que get, ça sert à quoi ?
    Désolé d'être long à la détente ....

  6. #6
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Citation Envoyé par LE NEINDRE
    Mais si je ne mets que get, ça sert à quoi ?
    Si tu mes que get ca veut dire que les classes qui implemente l'interface sont tous obligés de redefinir la methode get et que le set est facultatif.

    Citation Envoyé par LE NEINDRE
    ok, si je mets un set pour U_LOGIN dans la définition de l'interface lors de l'implémentation de la classe, je serai obligé de définir la variable.
    vous n'etes oblige de definir aucune variable, par contre vous etes obligé de definir une propriete U_LOGIN.get.
    U_LOGIN.get peut contenir n'importe quoi tant qu'elle est definit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private string login;
    public string U_LOGIN
    {
           get { return "Toto"; }  //fonctionne correctement
          // get { return login; }  aussi
    }
    essayez d'utiliser des methodes pour votre interface au lieu des proprietes remplacez string U_LOGIN { get;} par string getLogin() et string U_LOGIN { set;} par setLogin(string value) et faites quelque tests

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Ok, je pense avoir compris.
    Je vais faire quelques tests !
    Merci pour votre aide !!!

  8. #8
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Je vais te donner une exemple
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    public interface IUser
    {
    	string Name { get; }
    	string Username { get;}
    }
     
    public class User: IUser
    {
    	#region IUser Members
     
    	private string _name;
    	public string Name
    	{
    		get { return _name; }
    		set { _name = value;  }
    	}
     
    	private string _username;
    	public string Username
    	{
    		get { return _username; }
    		set { _username = value; }
    	}
     
    	#endregion
    }
     
    public class Test
    {
    	public Test(IUser user)
    	{
    	System.Diagnostics.Debug.WriteLine(string.Format("Name: {0}", user.Name));	
    					   	        		   System.Diagnostics.Debug.WriteLine(string.Format("Username: {0}", user.Username));
     
    	}
    }
    dans la form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void button1_Click(object sender, EventArgs e)
    {
    	User user = new User();
    	user.Name = "Martin";
    	user.Username = "Shwin";
     
    	Test test = new Test(user);
     
    }
    Dans cet exemple, on peut voir que jai une interface, et qui est implementer par la class User. L'interface permet de remplir un contrat, CAD d'être obliger d'avoir les méthodes déclaré dans l'interface. Mais elle sert aussi de vitrine, comme dans mon exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Test(IUser user)
    ici je recoit en iuser, donc si jamais je veux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    user.Username = "LENeindre"
    cela fonctionnera pas car je nest pas de set dans l'interface, alors que si jaurais passé j'aurais été capable de changer le username.

    Il est cependant possible de outrepassé cette protection en recastant la variable user en User
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((User)user).Username = "toto";
    Mais, l'interface sert de contrat ET de vitrine

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Bonjour Schwin !

    Et oui, tu m'avais parlé des interfaces sur un précédent post et j'essaie de les utiliser, non sans mal

    J'avais compris la vitrine et c'est comme ça que je l'utilisais mais pas forcément le contrat (obligation)

    Cependant l'exemple ci-dessous me laisse perplexe.
    Dans le code ci-dessous, je n'utilise (je crois bien) que l'aspect vitrine de l'interface et je suis confronté à une erreur bizarre.
    Voilà mon exemple:
    Le client appelle une webMethod (Authenticate(string user,string password)) d'un WebService.
    La WebMethod Authenticate(string,string), après validation dans base de donnée, instancie un nouvel objet de la classe User qu'elle retourne à l'utlisateur.
    Ci-dessous la webMethod Authenticate
    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
     
     
     
        [WebMethod]
        public user Authenticate(string Login, string Password)
        {
          bool authenticated = false;
          user U;
          ...
          ...
          //Si Login et password retourne un résulat dans BD -> Authenticated = true
     
          Authenticated = true;
          if(Authenticated)
          {
                    this.U = new user(Login);
          }
          else
          {
                    this.U = new user("");
          }      
     
          return _U;
        }

    La classe user est définie ainsi:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
     
    public interface Iuser
    {
        string U_LOGIN { get;}
        string U_SID { get;}
        string U_PORT {get;}
    }
     
    public class user : Iuser
    {
        private string _login = "";
        private string _sid = "";
        private string _port;
     
        public user()
        {
     
        }
        public user(string login):this()
        {
            U_LOGIN = login;
            U_SID = this.CreateEnvironment(U_LOGIN);
            U_PORT = this.GetPort(U_LOGIN);
        }
     
        public bool IAmConnected()
        {
             ...
        }
     
        public string CreateEnvironment(string login)
        {
              ...
             // return SID
        }
        public string GetPort(string login)
        { 
               ...
               return //PORT
        }
     
        //Accesseur
        public string U_LOGIN
        {
            get { return this._login; }
            private set { this._login = value; }
        }
        public string U_SID
        {
            get { return this._sid; }
            private set { this._sid = value; }
        }
        public string U_PORT
        {
            get { return this._port; }
            private set { this._port = value; }
        }
     
    }
    Et maintenant:
    Quand je fais appel à la fonction authenticate de mon webservice, de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    private _ediW = com.webeuredi.services.WebFunctions();
    private com.webeuredi.services.user _U;
    ...
    ...
    try
    {
             this._U = _ediW.Authenticate(this._mySettings.Username, this._mySettings.Password); //pas encore fait les accesseurs ;o)
    }
    catch (SoapException se)
    {
              MessageBox.Show(se.Message);
    }
    Et bien j'ai deux cas de figures lors de l'éxécution: pas d'erreur et erreur

    pas d'erreur : Lorsque dans la classe User, j'enlève private devant set au niveau des accesseurs
    Erreur : Lorsque dans la classe User, il y private denvant set au niveau des accesseurs.
    Le message d'erreur indique que les variables sont en lecture seules !!
    Pourtant ne fais que récupérer mes variables et non les définir ?
    L'interface Iuser indique que je ne suis pas obligé de les setter ?

    C'est bizarre non ?? Non ce ne dois pas être bizarre ! C'est plutôt moi qui doit mal comprendre

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    En écrivant le précédent message, je crois que j'ai compris.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this._U = _ediW.Authenticate(this._mySettings.Username, this._mySettings.Password);
    Ici j'instancie le user _U ... Mais il n'y a que la classe User qui a le droit de le faire !!

    C'est ça ?
    De plus, ce n'est pas un problème d'interface (je suis donc un peu hors sujet sur ce thread, désolé ) puisque je ne peux pas retourner d'interface dans une WebMethod

    Je ne vois donc qu'une solution aux vues d emes petites connaissances: enlever le private devant chaque set de mes accesseurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
     
        public string U_LOGIN
        {
            get { return this._login; }
            set { this._login = value; }
        }

  11. #11
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    Tu peux me dire ce que c'est _U ?

    moi je voit seulement la déclaration comme ceci
    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
     
    [WebMethod]
        public user Authenticate(string Login, string Password)
        {
          bool authenticated = false;
          user U;
          ...
          ...
          //Si Login et password retourne un résulat dans BD -> Authenticated = true
     
          Authenticated = true;
          if(Authenticated)
          {
                    this.U = new user(Login);
          }
          else
          {
                    this.U = new user("");
          }      
     
          return _U;
        }
    Tu instancie U mais tu return _U ?

    Montre moi un peux plus ton code stp!

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Oups excuse,
    Je m'étais trompé en recopiant.

    Voilà la webmethod Authenticate (ouvert à toute critique avec plaisir, je suis sur que je dois faire plus propre)

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
        [WebMethod]
        public user Authenticate(string Login, string Password)
        {
     
            string bd_password="";
            BD MyBD = new BD();
            OdbcConnection con = MyBD.Connect();
            try
            {
                OdbcCommand MyCommand = new OdbcCommand();
                MyCommand.Connection = con;
                MyCommand.CommandText = "SELECT PASSWORD FROM login WHERE LOGIN=\'" + Login + "\'";
                OdbcDataReader MyDataReader;
                MyDataReader = MyCommand.ExecuteReader();
                while (MyDataReader.Read())
                {
                    bd_password = MyDataReader.GetString(0);
                }
                con.Close();
     
                if (bd_password == Password)
                {
                    //Création du nouvel utilisateur
                    this.U = new user(Login);
                    // Inscription dans la base de données et Assignation du résultat.
                    U.IAmConnected();
                }
     
                else
                {
                    this.U = new user("");
                }
     
            }
            catch (Exception ex)
            {
                new Error("Error Authenthicate()", "no_user").WriteError(ex.Message);
            }
            return U;
        }

    Et la classe user que j'ai un peu changé (mais alors là j'crois que je suis parti un peu mal)
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
     
     
    public interface Iuser
    {
        string U_LOGIN { get;}
        string U_SID { get;}
        string U_PORT { get;}
    }
     
    public class user : Iuser
    {
        private string _login = "";
        private string _sid = "";
        private string _port;
     
        public user()
    	{
     
        }
        public user(string login):this()
        {
            U_LOGIN = login;
            U_SID = login;
            U_PORT = login; //Les instanciations de U_SID et U_PORT se font à partir de login
        }
     
        public string IAmConnected()
        {
            DataSet oDataSet;
            OdbcDataAdapter oDataAdapter;
            DateTime dt = DateTime.Now;
            BD bd = new BD();
            OdbcConnection con = bd.Connect();
            oDataAdapter = new OdbcDataAdapter("select * from connected", con);
            oDataSet = new DataSet("Connected");
            oDataAdapter.Fill(oDataSet, "Connected");
            oDataAdapter.InsertCommand = new OdbcCommand("INSERT INTO connected(LOGIN,SID,DATE,HOUR) Values(?,?,?,?)", con);
            oDataAdapter.InsertCommand.Parameters.Add("@LOGIN", OdbcType.VarChar, 10, "LOGIN");
            oDataAdapter.InsertCommand.Parameters.Add("@SID", OdbcType.VarChar, 10, "SID");
            oDataAdapter.InsertCommand.Parameters.Add("@DATE", OdbcType.VarChar, 10, "DATE");
            oDataAdapter.InsertCommand.Parameters.Add("@HOUR", OdbcType.VarChar, 10, "HOUR");
            DataRow oDataRow;
            oDataRow = oDataSet.Tables["Connected"].NewRow();
            oDataRow["LOGIN"] = this._login;
            oDataRow["SID"] = this._sid;
            oDataRow["DATE"] = dt.Year.ToString().Substring(2,2)+dt.Month.ToString("d2")+dt.Day.ToString("d2");
            oDataRow["HOUR"] = dt.Hour.ToString("d2")+dt.Minute.ToString("d2");
            oDataSet.Tables["Connected"].Rows.Add(oDataRow);
     
            try
            {
                oDataAdapter.Update(oDataSet, "Connected");
            }
            catch (Exception e)
            {
                return e.Message.ToString();
     
            }
            con.Close();
            return "1";
        }
     
        public string CreateEnvironment(string login)
        {
            int[] ASCII_TAB = new int[62];
            char[] CODE_TAB = new char[10];
            string CODE = "";
            Random rnd = new Random();
            int total = 0;
            string NewDir = new Path().StoreDir+"\\"+this._login+"\\";
            //Génération du code aléatoire
            for (int i = 48; i <= 57; i++) { ASCII_TAB[total] = i; total++; }
            for (int i = 65; i <= 90; i++) { ASCII_TAB[total] = i; total++; }
            for (int i = 97; i <= 122; i++) { ASCII_TAB[total] = i; total++; }
            for (int j = 0; j < CODE_TAB.Length; j++)
            {
                CODE_TAB[j] = Convert.ToChar((int)ASCII_TAB[rnd.Next(0,61)]);
                CODE += CODE_TAB[j].ToString();
            }
     
            //Vérification existence du dossier et création
     
            if (System.IO.Directory.Exists(NewDir+CODE))
            {
                CreateEnvironment(this._login);
            }
            else
            {
                System.IO.Directory.CreateDirectory(NewDir+CODE);
            }
        //On retourne le nom du répertoire
        return CODE;
        }
        public string GetPort(string login)
        {
            BD MyBD = new BD();
            OdbcConnection con = MyBD.Connect();
            OdbcCommand MyCommand = new OdbcCommand();
            MyCommand.Connection = con;
            MyCommand.CommandText = "SELECT PORT FROM login_port WHERE LOGIN=\'" + login + "\'";
            OdbcDataReader MyDataReader;
            MyDataReader = MyCommand.ExecuteReader();
            Int16 res = 0;
            while (MyDataReader.Read())
            {
                res = MyDataReader.GetInt16(0);
            }
            con.Close();
            return res.ToString();
        }
     
        //Accesseur
        public string U_LOGIN
        {
            get { return this._login; }
            set { this._login = value; }
        }
        public string U_SID
        {
            get { return this._sid; }
            set { if (value != "") { this._sid = this.CreateEnvironment(value); }; }
        }
        public string U_PORT
        {
            get { return this._port; }
            set { if (value != "") { this._port = GetPort(U_LOGIN); } else { this._port = ""; } }
        }
     
    }
    Shwin, n'hésite pas à me dire ce qui va pas ! enfin, si tu as un peu de temps ...
    Merci beaucoup pour ton aide !!!

  13. #13
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Citation Envoyé par LE NEINDRE
    pas d'erreur : Lorsque dans la classe User, j'enlève private devant set au niveau des accesseurs
    Erreur : Lorsque dans la classe User, il y private denvant set au niveau des accesseurs.
    Le message d'erreur indique que les variables sont en lecture seules !!
    P
    Tu peux nous montrer du code pour les 2 cas?
    et le message exacte de l'erreur. et à quelle ligne.
    dans le web service elle est la declaration du user ?

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Salut medhi_tn,
    Tout le code est présent sur mon dernier post.
    La déclaration de user se fait dans la webmethod Authenticate().
    Le code de mon précédent post fonctionne.

    Il ne fonctionne pas lorsque j'écris la classe user de cette façon:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    
    public interface Iuser
    {
        string U_LOGIN { get;}
        string U_SID { get;}
        string U_PORT { get;}
    }
    
    public class user : Iuser
    {
        private string _login = "";
        private string _sid = "";
        private string _port;
    
        public user()
    	{
            
        }
        public user(string login):this()
        {
            U_LOGIN = login;
            U_SID = login;
            U_PORT = login; //Les instanciations de U_SID et U_PORT se font à partir de login
        }
        
        public string IAmConnected()
        {
            DataSet oDataSet;
            OdbcDataAdapter oDataAdapter;
            DateTime dt = DateTime.Now;
            BD bd = new BD();
            OdbcConnection con = bd.Connect();
            oDataAdapter = new OdbcDataAdapter("select * from connected", con);
            oDataSet = new DataSet("Connected");
            oDataAdapter.Fill(oDataSet, "Connected");
            oDataAdapter.InsertCommand = new OdbcCommand("INSERT INTO connected(LOGIN,SID,DATE,HOUR) Values(?,?,?,?)", con);
            oDataAdapter.InsertCommand.Parameters.Add("@LOGIN", OdbcType.VarChar, 10, "LOGIN");
            oDataAdapter.InsertCommand.Parameters.Add("@SID", OdbcType.VarChar, 10, "SID");
            oDataAdapter.InsertCommand.Parameters.Add("@DATE", OdbcType.VarChar, 10, "DATE");
            oDataAdapter.InsertCommand.Parameters.Add("@HOUR", OdbcType.VarChar, 10, "HOUR");
            DataRow oDataRow;
            oDataRow = oDataSet.Tables["Connected"].NewRow();
            oDataRow["LOGIN"] = this._login;
            oDataRow["SID"] = this._sid;
            oDataRow["DATE"] = dt.Year.ToString().Substring(2,2)+dt.Month.ToString("d2")+dt.Day.ToString("d2");
            oDataRow["HOUR"] = dt.Hour.ToString("d2")+dt.Minute.ToString("d2");
            oDataSet.Tables["Connected"].Rows.Add(oDataRow);
    
            try
            {
                oDataAdapter.Update(oDataSet, "Connected");
            }
            catch (Exception e)
            {
                return e.Message.ToString();
    
            }
            con.Close();
            return "1";
        }
    
        public string CreateEnvironment(string login)
        {
            int[] ASCII_TAB = new int[62];
            char[] CODE_TAB = new char[10];
            string CODE = "";
            Random rnd = new Random();
            int total = 0;
            string NewDir = new Path().StoreDir+"\\"+this._login+"\\";
            //Génération du code aléatoire
            for (int i = 48; i <= 57; i++) { ASCII_TAB[total] = i; total++; }
            for (int i = 65; i <= 90; i++) { ASCII_TAB[total] = i; total++; }
            for (int i = 97; i <= 122; i++) { ASCII_TAB[total] = i; total++; }
            for (int j = 0; j < CODE_TAB.Length; j++)
            {
                CODE_TAB[j] = Convert.ToChar((int)ASCII_TAB[rnd.Next(0,61)]);
                CODE += CODE_TAB[j].ToString();
            }
    
            //Vérification existence du dossier et création
    
            if (System.IO.Directory.Exists(NewDir+CODE))
            {
                CreateEnvironment(this._login);
            }
            else
            {
                System.IO.Directory.CreateDirectory(NewDir+CODE);
            }
        //On retourne le nom du répertoire
        return CODE;
        }
        public string GetPort(string login)
        {
            BD MyBD = new BD();
            OdbcConnection con = MyBD.Connect();
            OdbcCommand MyCommand = new OdbcCommand();
            MyCommand.Connection = con;
            MyCommand.CommandText = "SELECT PORT FROM login_port WHERE LOGIN=\'" + login + "\'";
            OdbcDataReader MyDataReader;
            MyDataReader = MyCommand.ExecuteReader();
            Int16 res = 0;
            while (MyDataReader.Read())
            {
                res = MyDataReader.GetInt16(0);
            }
            con.Close();
            return res.ToString();
        }
    
        //Accesseur
        public string U_LOGIN
        {
            get { return this._login; }
            private set { this._login = value; }
        }
        public string U_SID
        {
            get { return this._sid; }
            private set { if (value != "") { this._sid = this.CreateEnvironment(value); }; }
        }
        public string U_PORT
        {
            get { return this._port; }
            private set { if (value != "") { this._port = GetPort(U_LOGIN); } else { this._port = ""; } }
        }
    
    }
    Ce qui est en gras a été rajouté par rapport au précédent post et c'est cela qui cause l'erreur.

    L'erreur est:

    System.Web.Services.Protocols.SoapException: Le serveur n'a pas pus traiter la demande. --->System.InvalidOperationException: Impossible de générer une classe temporaire(result=1).
    error CS0200: La propriété ou l'indexeur 'user.U_LOGIN' ne peut être assigné -- il est en lecture seule
    error CS0200: La propriété ou l'indexeur 'user.U_SID' ne peut être assigné -- il est en lecture seule
    error CS0200: La propriété ou l'indexeur 'user.U_PORT' ne peut être assigné -- il est en lecture seule


  15. #15
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    Par défaut
    tu doit surement avoir à quelque part dautre dans ton code, une ligne qui dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    user.U_LOGIN = "valeur"
    Parce que je ne trouve pas d'erreur dans ton code, jai pourtant tester!
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    public interface IUser
    	{
    		string U_LOGIN { get;}
    		string U_SID { get;}
    		string U_PORT { get;}
    	}
     
    	public class User : IUser
    	{
    		private string _login = "";
    		private string _sid = "";
    		private string _port;
     
    		public User()
    		{
     
    		}
    		public User(string login)
    			: this()
    		{
    			U_LOGIN = login;
    			U_SID = login;
    			U_PORT = login; //Les instanciations de U_SID et U_PORT se font à partir de login
    		}
     
    		public string IAmConnected()
    		{
    			return null;
    		}
     
    		public string CreateEnvironment(string login)
    		{
    			return null;
    		}
    		public string GetPort(string login)
    		{
    			return null;
    		}
     
    		//Accesseur
    		public string U_LOGIN
    		{
    			get { return this._login; }
    			set { this._login = value; }
    		}
    		public string U_SID
    		{
    			get { return this._sid; }
    			set { if (value != "") { this._sid = this.CreateEnvironment(value); }; }
    		}
    		public string U_PORT
    		{
    			get { return this._port; }
    			set { if (value != "") { this._port = GetPort(U_LOGIN); } else { this._port = ""; } }
    		}
     
    	}
    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 User Authenticate(string Login, string Password)
    		{
     
    			User U;
    			U = new User(Login);
     
    			return U;
    		}
     
     
     
    		private void button1_Click(object sender, EventArgs e)
    		{
     
    			User u = Authenticate("shwin", "shwin");
    		}

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Bonjour Shwin !

    merci d'avoir pris le temps de tester mon code

    Pour le code que tu as écris, ça marche pour moi aussi.
    Dans la classe User, tu as mis:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    public interface IUser
    	{
    		string U_LOGIN { get;}
    		string U_SID { get;}
    		string U_PORT { get;}
    	}
     
    	public class User : IUser
    	{
    		private string _login = "";
    		private string _sid = "";
    		private string _port;
     
    		public User()
    		{
     
    		}
    		public User(string login)
    			: this()
    		{
    			U_LOGIN = login;
    			U_SID = login;
    			U_PORT = login; //Les instanciations de U_SID et U_PORT se font à partir de login
    		}
     
    		public string IAmConnected()
    		{
    			return null;
    		}
     
    		public string CreateEnvironment(string login)
    		{
    			return null;
    		}
    		public string GetPort(string login)
    		{
    			return null;
    		}
     
    		//Accesseur
    		public string U_LOGIN
    		{
    			get { return this._login; }
    			set { this._login = value; }
    		}
    		public string U_SID
    		{
    			get { return this._sid; }
    			set { if (value != "") { this._sid = this.CreateEnvironment(value); }; }
    		}
    		public string U_PORT
    		{
    			get { return this._port; }
    			set { if (value != "") { this._port = GetPort(U_LOGIN); } else { this._port = ""; } }
    		}
     
    	}
    Et ça fonctionne.

    Mais lorsque j'écris la classe User ainsi (les changements sont en gras):
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
     
    public interface IUser
    	{
    		string U_LOGIN { get;}
    		string U_SID { get;}
    		string U_PORT { get;}
    	}
     
    	public class User : IUser
    	{
    		private string _login = "";
    		private string _sid = "";
    		private string _port;
     
    		public User()
    		{
     
    		}
    		public User(string login)
    			: this()
    		{
    			U_LOGIN = login;
    			U_SID = login;
    			U_PORT = login; //Les instanciations de U_SID et U_PORT se font à partir de login
    		}
     
    		public string IAmConnected()
    		{
    			return null;
    		}
     
    		public string CreateEnvironment(string login)
    		{
    			return null;
    		}
    		public string GetPort(string login)
    		{
    			return null;
    		}
     
    		//Accesseur
    		public string U_LOGIN
    		{
    			get { return this._login; }
    			private set { this._login = value; }
    		}
    		public string U_SID
    		{
    			get { return this._sid; }
    			private set { if (value != "") { this._sid = this.CreateEnvironment(value); }; }
    		}
    		public string U_PORT
    		{
    			get { return this._port; }
    			private set { if (value != "") { this._port = GetPort(U_LOGIN); } else { this._port = ""; } }
    		}
     
    	}

    J'ai l'erreur suivante:

    System.Web.Services.Protocols.SoapException: Le serveur n'a pas pus traiter la demande. --->System.InvalidOperationException: Impossible de générer une classe temporaire(result=1).
    error CS0200: La propriété ou l'indexeur 'user.U_LOGIN' ne peut être assigné -- il est en lecture seule
    error CS0200: La propriété ou l'indexeur 'user.U_SID' ne peut être assigné -- il est en lecture seule
    error CS0200: La propriété ou l'indexeur 'user.U_PORT' ne peut être assigné -- il est en lecture seule
    Le fait de mettre private devant l'accesseur de propriété set indique t'il que seul le constructeur de la classe User peut setter cette variable ??

  17. #17
    Membre émérite
    Avatar de shwin
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    568
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2003
    Messages : 568
    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
    13
    14
    15
    16
    17
     
    //Accesseur
    		public string U_LOGIN
    		{
    			get { return this._login; }
    			private set { this._login = value; }
    		}
    		public string U_SID
    		{
    			get { return this._sid; }
    			private set { if (value != "") { this._sid = this.CreateEnvironment(value); }; }
    		}
    		public string U_PORT
    		{
    			get { return this._port; }
    			private set { if (value != "") { this._port = GetPort(U_LOGIN); } else { this._port = ""; } }
    		}
    Fonctionne #1
    Fait une recherche dans ta solution (dans VS, shift+ctrl+f) pour .U_PORT =

    D'apres moi tu as un bout de code quelque part qui essaye de setter le port de l'extérieur de la class

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut

    Rechercher tout "U_PORT =", Sous-dossiers, Résultats de la recherche 1, "Solution complète"
    Lignes correspondantes*: 0 Fichiers correspondants*: 0 Nombre de fichiers recherchés*: 40


    Rechercher tout "U_PORT=", Sous-dossiers, Résultats de la recherche 1, "Solution complète"
    Lignes correspondantes : 0 Fichiers correspondants : 0 Nombre de fichiers recherchés : 40


    Je ne comprends pas ...

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Par défaut
    Oups,
    j'avais pas recherché au bon endroit:
    Voilà le résultat de la recherche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     
    Rechercher tout "U_PORT =", Sous-dossiers, Résultats de la recherche 1, "Solution complète"
      C:\Inetpub\wwwroot\webeuredi\App_Code\user.cs(40):        U_PORT = login; //Les instanciations de U_SID et U_PORT se font à partir de login
      C:\Inetpub\wwwroot\webeuredi\App_Code\user.cs(48):        U_PORT = login; //Les instanciations de U_SID et U_PORT se font à partir de login
      Lignes correspondantes*: 2    Fichiers correspondants*: 1    Nombre de fichiers recherchés*: 25
    Mais je pense que c'est pareil non ?

  20. #20
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Clair que tu veux acceder au set de la propriete je ne vois pas d'autres probleme . Si tu as referencé ton web service dans un projet essai de l'enlever. sinon cree une nouvelle solution et un ptit copier coller de tes classes et recompile le tout juste pour voir sinon essai d'uploader ta solution pour qu'on la teste.

    A+

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Turbo Pascal] Utilisation des interfaces graphiques en Pascal
    Par shangogo dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 10/05/2010, 22h13
  2. bonne utilisation des interfaces
    Par flo1981 dans le forum C#
    Réponses: 12
    Dernier message: 16/09/2009, 10h00
  3. Utilisation des interfaces dans des méthodes
    Par kyrilkarlier dans le forum Windows Forms
    Réponses: 7
    Dernier message: 26/05/2009, 14h29
  4. Réponses: 2
    Dernier message: 27/04/2006, 16h45

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