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

C# Discussion :

declaration comparer dans classe statique


Sujet :

C#

  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut declaration comparer dans classe statique
    Je suis perdu !
    Je viens de rassembler dans une classe statique, une liste, sa structure est deux comparer
    Avant tout etait dans ma form et ca marchait tres bien

    Mais maintenant je ne parviens plus a declarer et instancier correctement mes comparer quelqu'un peut il 'aider !

    En bas du code en commentaire l'instanciation de mes comparer tel que c'etait avant


    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
    using System;
    using System.Collections.Generic;
    using System.Text;
     
    namespace Recutex
    {
      static public class ListAddr
      {
        public struct S_Addr
        {
          public int AddrId;
          public int X;       // X ecran
          public int Y;       // Y ecran
          public int WGSX;
          public int WGSY;
          public int order;
          public int ordern;
          public bool active;
        };
     
        static public List<S_Addr> AddrLst = new List<S_Addr>();
     
        public class S_AddrIdComparer : IComparer<S_Addr>
        {
          public int Compare(S_Addr a, S_Addr b)
          {
            return a.AddrId - b.AddrId;
          }
        };
        public class S_AddrActiveOrderComparer : IComparer<S_Addr>
        {
          public int Compare(S_Addr a, S_Addr b)
          {
            int dif;
            if (a.active == b.active)
            {
              if (a.active == false)
              {
                return 999;
              }
              dif = (a.order - b.order);
              return dif;
            }
            if (a.active == true) return -1;
            return 0;
          }
        };
     
    //    S_AddrIdComparer compareId = new S_AddrIdComparer();
     //   S_AddrActiveOrderComparer compareActiveOrder = new S_AddrActiveOrderComparer();
      }
    }

  2. #2
    Membre émérite
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Par défaut
    Bonsoir,

    C'est pas plutôt ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ListAddr.S_AddrIdComparer compareId = new ListAddr.S_AddrIdComparer();
     
    ListAddr.S_AddrActiveOrderComparer compareActiveOrder = new ListAddr.S_AddrActiveOrderComparer();

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Pas vraiment
    Ce serait ca s'il fallait instancier ces comparer en dehors de la classe

    Mais conceptuellement la classe etant statique et les comparer etant intégralement lié a la classe et ses membre il n'y a aucune raison de les instancier ailleurs (ce serait contraire a l'idée de declarer cette classe statique)

    Cela etant je ne parviens toujours pas a declarer correctement ces comparer

    Et j'espere ne pas devoir les instancier exterieurement, ce serait idiot !

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je n'en suis pas certain, mais je me demande s'il n'y aurait pas une contrainte comme quoi les classes déclarées dans une classe statique doivent aussi être statiques...
    Tu as une erreur à la compilation ou à l'exécution ? et quelle est l'erreur ?

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Surtout : pourquoi as-tu fait une classe statique ? Si tu veux une liste de ta struct avec un comportement particulier, il vaudrait mieux faire 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
    public struct Addr
    {
    ...
    }
     
    public class ListdeAddr : List<Addr>
    {
      // tes comparers, privés
      public SortByMachin()
      {
         // trier this en utlisant ton comparateur machin
      }
      public SortByBidule()
      {
         // trier this en utlisant ton comparateur bidule
      }
    }
     
    //ailleurs dans le code :
    ListdeAddr maliste = new ListdeAddr();
    maliste.Add(desTasDeTrucs);
    maliste.SortByMachin();

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut A la compilation
    Erreur de compilation

    Si je retire mes comentaire
    Can not declare instance member in a static class
    Je comprends et c'est +/- normal
    Le tout c'est de trouver COMMENT declarer ce comparer pour pouvoir l'exploiter a l'execution ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ah ok... c'est simplement parce que X et Y ne sont pas déclarés statiques à mon avis. Ce code devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static S_AddrIdComparer compareId = new S_AddrIdComparer();
    static S_AddrActiveOrderComparer compareActiveOrder = new S_AddrActiveOrderComparer();
    Sinon, Guulh a raison je pense, une classe statique n'est pas la bonne solution ici. Il me semble que la classe S_Addr est susceptible d'être manipulée hors d'une liste, donc ça n'a pas vraiment de sens de la déclarer dans une autre classe. Et avec ta conception tu ne peux avoir qu'une seule liste d'adresses...

  8. #8
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Statique
    Je l'ai declarée statique car c'et une base de travail pour plusieurs form et plusieurs autre classe et plusieurs procedure

    Donc asser casse bonbon de la passer partout en parametre, dans les constructeur etc

    C'est peut etre pas tres orthodoxe mais dans le cas present c'est BEAUCOUP plus confortable et lisible de l'avoir statique

    N.B: dans un premier temps, j'avais opté pour ce que tu propose pour finir par decider d'essayer de mettre statique

    C'est quand meme pas impossible de déclarer une methode dans une classe statique !!??

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par olibara Voir le message
    Je l'ai declarée statique car c'et une base de travail pour plusieurs form et plusieurs autre classe et plusieurs procedure

    Donc asser casse bonbon de la passer partout en parametre, dans les constructeur etc

    C'est peut etre pas tres orthodoxe mais dans le cas present c'est BEAUCOUP plus confortable et lisible de l'avoir statique
    Je vois ce que tu veux dire, mais la classe "liste d'adresses" n'a pas besoin d'être elle-même statique. Il suffit de créer une instance unique qui est membre statique d'une classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class Program
    {
        public static List<S_Addr> Addresses = new List<S_Addr>();
     
        static void Main(string[] args)
        {
            foreach(S_Addr a in Program.Addresses)
            {
                Console.WriteLine(a.ToString());
            }
        }
     
    }
    Tu peux accéder à Program.Addresses à partir de n'importe où dans ton code, sans avoir besoin de créer un classe statique juste pour ça.

  10. #10
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut BINGO
    Merci Tomlev

    Tu a raison pour X et Y ca marche

    Je ne crois pas que mon option soit si mauvaise
    1- Ma liste d'adresse est concue pour etre exhaustive et elle est le snapshot d'une situation DB
    2- Oui je vais utiliser une deuxieme liste basée sur le meme principe et déclarée dans la meme classe : d'un coté les adresses vertes de l'autre les adresses bleues !
    C'est tout
    La structure d'adresse S_Addr est declarée là aussi car elle n'a de sens ici que si addrlist existe je ne l'utilise que pour manipuler des elements d'AddrList

    Dans le cas present j'utilise cette classe comme passe partout bien emballé !

  11. #11
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci Tomlev

    Tu a raison pour X et Y ca marche

    Je ne crois pas que mon option soit si mauvaise
    euh, si

    Les classes statiques sont un concept relativement recent en C#, qui ont une utilite bien precise. Hors ce que tu cherches a faire est simple et rodé, c'est une variable globale ou un singleton, c'est a dire une instance unique accessible de partout, pas un objet qui soit intrinsequement statique.

    Quant a la chtite struct contenue dans ta liste, c'est un objet metier, qui n'a aucune raison de ne pas avoir de vie hors de la liste.

  12. #12
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut instance unique statique
    Tu a raison

    Mais je reviens a mon principe d'emballage

    J'aime bien regrouper les entitée qui ont un etroit lien commun ensemble

    Je me suis battu des années en C dans des codes ou les développeurs pondaient des variables a la vitesse de leur imagination, je regroupe systematiquement tout dans des structures

    Pour les classes c'est la meme chose a qoui ca sert sinon a distinguer des entités ?

    Et a partir du moment ou listAddr EST statique pourquoi la mettre dans une classe qui ne serait pas statique ?

    Bon je dis ca mais je suis nouveau en C# je n'ai que +/- 6 semaines de vol

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Guulh Voir le message
    euh, si

    Les classes statiques sont un concept relativement recent en C#, qui ont une utilite bien precise. Hors ce que tu cherches a faire est simple et rodé, c'est une variable globale ou un singleton, c'est a dire une instance unique accessible de partout, pas un objet qui soit intrinsequement statique.

    Quant a la chtite struct contenue dans ta liste, c'est un objet metier, qui n'a aucune raison de ne pas avoir de vie hors de la liste.
    tout est dit

  14. #14
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par olibara Voir le message
    Et a partir du moment ou listAddr EST statique
    Mon époque C est loin et je ne sais plus exactement ce que static signifie dans ce langage. Le concept de static est flou pour un certain nombre de personnes, ce qui occasionne pas mal d'erreurs. Je répète que dans ton cas, tu cherches simplement à avoir une instance accessible depuis de nombreux endroits ; ta liste devrait donc être soit un singleton, soit préférentiellement comme l'indiquait tomlev un membre statique d'une classe accessible à tout le monde.

    Donc, reprenons : ça veut dire quoi, static, pour toi ? ?

  15. #15
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut

    En C, statique pour une variable declarée dans une fonction signifie qu"elle est remanente a cette fonction (tout en n'etant visible que par elle) la variable est allouée une fois mais peut etre modifié par la fonction

    Statique pour une fonction est utile dans le cas d'une librairie cela signifie que la fonction sera instanciée pour chaque thread qui l'appelle.


    En Csharp je considere qu'une classe statique est une classe instancié UNE et UNE seule fois a l'ouverure de l'application elle sera visible par tous les membres de l'application. On ne peut pas creer de nouvelle instance de cette classe au run time. Cela me semble parfaitement convenir a des variables d'environnement ou des informations centralisées a partager

    Une variable publique doit etre déclarée statique si on veut y acceder directement depuis une autre classe sans passer par un get set

    Le statique "fixe" l'adressage de cette variable

    Dans mon cas cette classe accessible a tout le monde ne peut avoir qu'une seule instance, c'est une classe d'information pilote qui DOIT etre instanciée et que tout le monde doit pouvoir acceder et modifier mais je ne peux en avoir qu'une et une seule

  16. #16
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par olibara Voir le message
    En Csharp je considere qu'une classe statique est une classe instancié UNE et UNE seule fois a l'ouverure de l'application elle sera visible par tous les membres de l'application.
    Une classe statique n'est pas instanciée du tout.

    On ne peut pas creer de nouvelle instance de cette classe au run time.
    Tu veux une liste qui soit visible partout dans l'appli, bien. Mais pourquoi voudrais-tu t'interdire de créer d'autres listes de ton objet Addr ?

    Cela me semble parfaitement convenir a des variables d'environnement ou des informations centralisées a partager
    Dans ce cas, la façon usuelle de faire est plutôt de créer une classe statique / un singleton (appellons Cache) dans lequel on met en propriétés les données visibles par tout le monde.

    Une variable publique doit etre déclarée statique si on veut y acceder directement depuis une autre classe sans passer par un get set
    Non... statique, ce n'est que ça : (je mets en gras le nom de la classe, et en italique les instances)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Bidule
    {
      public int IntdInstance { get { ... } set { ...} }
      public void f() { ... }
      public static int IntStatique { get { ... } set { ...} }
      public static void g() { ... }
    }
    
    Bidule b = new Bidule();
    Bidule.f(); // ok
    b.g();
    int i = b.IntdInstance;
    int j = Bidule.IntStatique;
    Le statique "fixe" l'adressage de cette variable
    Non plus...

    Dans mon cas cette classe accessible a tout le monde ne peut avoir qu'une seule instance, c'est une classe d'information pilote qui DOIT etre instanciée et que tout le monde doit pouvoir acceder et modifier mais je ne peux en avoir qu'une et une seule
    Singleton

  17. #17
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Soit
    Et comment tu déclare ce singleton !

    Qui doit contenir deux liste A et B
    Composées de la structure S
    et pouvoir exploiter deux comparer (tri pas S.nom, tri par S.id)

  18. #18
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    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
    class Cache
    {
      private static Cache _instance = new Cache();
      public static Cache Instance { get { return _instance; } }
     
      private Cache() { } // constructeur privé => impossible à instancier de l'extérieur
      private List<Addr> _listedAdresses = new List<Addr>();
      public List<Addr> Adresses {get { return _listedAdresses; } }
    }
     
    // dans ton code d'accès à la base :
    foreach(...)
      Cache.Instance.Adresses.Add(unTruc);
     
    // dans tes forms :
    maCombo.DataSource = Cache.Instance.Adresses;
    Après, tu peux comme je l'ai montré hier surcharger la classe List<Addr> pour lui ajouter des méthodes de tri personnalisées.

  19. #19
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Merci
    Merci

    Effectivement ca me semble plus rationnel

    Je dois encore m'habituer a la POO

  20. #20
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par olibara Voir le message
    Merci

    Effectivement ca me semble plus rationnel

    Je dois encore m'habituer a la POO
    Je te conseille notamment de te renseigner sur les design patterns si tu ne les connais pas. Ce sont de "bonnes pratiques" de conception objet qui ont largement prouvé leur pertinence. Quelques ressources sur les design patterns :
    http://merlin.developpez.com/cours/d...esign-pattern/
    http://www.dofactory.com/Patterns/Patterns.aspx (en anglais)

Discussions similaires

  1. erreur dans la declaration d'une classe
    Par lylya dans le forum Débuter
    Réponses: 9
    Dernier message: 13/04/2010, 15h09
  2. Réponses: 2
    Dernier message: 06/03/2009, 09h52
  3. Réponses: 2
    Dernier message: 17/04/2008, 18h23
  4. Tableau de constantes dans une classe statique
    Par Nico_stras dans le forum C#
    Réponses: 4
    Dernier message: 05/03/2007, 20h18
  5. [VB.NET] Declaration problématique dans une classe
    Par joefou dans le forum VB.NET
    Réponses: 8
    Dernier message: 01/03/2006, 11h38

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