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 :

Classes différenciées par le type d'une seule variable membre et ObservableCollection


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut Classes différenciées par le type d'une seule variable membre et ObservableCollection
    Bonjour,

    J'ai une ObservableCollection servant de source à un DataGrid.
    Le truc, c'est que les objets contenus dans mon ObservableCollection sont de types quasiment identiques.
    En effet, ils ne diffèrent que par le type d'une seule variable membre.

    Du coup, je me suis dit, on va utiliser les classes génériques et faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Parameter<T>
    {
       private string name;
       private T value;
       ...
    }
    Malheureusement, quand j'essaie de créé mon ObservableCollection de Parameter, j'ai une erreur de compil et je ne sais pas comment la déclarer (et si c'est possible).
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ObservableCollection<Parameter> params;
    ObservableCollection<Parameter<?>> params;
    ObservableCollection<Parameter<T>> params;
    ObservableCollection<Parameter<>> params;
    Quelqu'un aurait une idée ?

    Merci d'avance.

    PS : j'ai aussi pensé à utiliser une classe-mère contenant tous les attributs communs et des classes filles n'ajoutant que la variable dont le type diffère, mais ça ne me paraît pas top...

  2. #2
    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 : 43
    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
    Ce n'est pas possible. Même si les types sont "quasiment identiques", ils ne sont pas compatibles pour autant... du point de vue du compilateur ce sont des types tout à fait différents.

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ce n'est pas possible. Même si les types sont "quasiment identiques", ils ne sont pas compatibles pour autant... du point de vue du compilateur ce sont des types tout à fait différents.

    Mais c'est pour cela qu'il a créé une classe générique Parameter<T> avec T étant le membre variant.

    Donc une déclaration de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ObservableCollection<Parameter<string>> myCollection;
    est valide.

    J'avoue que je ne vois pas bien où il a un problème

    (à moins qu'il ait vraiment utilisé params comme nom de variable, mais je ne pense pas quand même )

  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 : 43
    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 Bluedeep Voir le message
    Donc une déclaration de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ObservableCollection<Parameter<string>> myCollection;
    est valide.
    Oui, je suis d'accord avec ça... ce que je dis, c'est qu'on ne peut pas avoir une ObservableCollection qui contient à la fois des Parameter<string>, des Parameter<int>, des Parameter<toto>, etc... Tous les éléments doivent être de même type, ou du moins avoir un type de base commun. Dans ce cas, le seul "ancêtre" commun est le type Object...

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Oui, je suis d'accord avec ça... ce que je dis, c'est qu'on ne peut pas avoir une ObservableCollection qui contient à la fois des Parameter<string>, des Parameter<int>, des Parameter<toto>, etc... Tous les éléments doivent être de même type, ou du moins avoir un type de base commun. Dans ce cas, le seul "ancêtre" commun est le type Object...
    Ok, j'avais pas perçu correctement son problème.

    Oui, effet, dans ce cas il suffit qu'il fasse 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
     
    class ParameterBase
    {
     // tous ses champs communs
     // .........
    }
     
    class Parameter<T> : ParameterBase
    {
      T _MySpecificField;
    }
     
    ObservableCollection<ParameterBase> myCollection;

  6. #6
    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 : 43
    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 oui tiens, j'avais même pas pensé à ça...
    Mais dans ce cas, ce n'est pas très pratique à manipuler, car on n'a pas directement accès au champ dont le type varie à partir du type ParameterBase. On pourrait ajouter dans cette classe une propriété Object, qui serait redéfinie dans Parameter<T> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class ParameterBase
    {
        public string Name { get; set; }
        public object Value { get; set; }
    }
     
    class Parameter<T> : ParameterBase
    {
        new public T Value
        {
            get { return (T)base.Value; }
            set { base.Value = value; }
        }
    }
    Comme ça, quand on manipule un ParameterBase, Value renvoie un object, et quand on manipule un Parameter<T>, Value renvoie un T

  7. #7
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Citation Envoyé par tomlev Voir le message
    ce que je dis, c'est qu'on ne peut pas avoir une ObservableCollection qui contient à la fois des Parameter<string>, des Parameter<int>, des Parameter<toto>, etc...
    C'est bien à ça que je veux arriver...

    Je testerai votre solution demain matin.

    Question supplémentaire : cette syntaxe, c'est une surcharge de propriété, c'est ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        new public T Value
        {
            get { return (T)base.Value; }
            set { base.Value = value; }
        }

  8. #8
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Non

    La surcharge c'est le fait de définir plusieurs méthodes de même nom mais avec des paramètres différents.

    Le new dans ce cas de figure sert à masquer un membre hérité, cf. MSDN

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2014, 10h13
  2. Réponses: 2
    Dernier message: 26/12/2010, 18h34
  3. [AC-2003] Remplacer plusieurs textbox par un label et une seule textbox
    Par buzz73 dans le forum IHM
    Réponses: 2
    Dernier message: 21/12/2009, 12h35
  4. Réponses: 1
    Dernier message: 08/11/2006, 12h16
  5. Réponses: 11
    Dernier message: 31/01/2005, 17h48

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