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 :

Génériques => Type de la classe conteneur en paramètre


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut Génériques => Type de la classe conteneur en paramètre
    (re) bonjour @ tous,

    Voilà, c'est un peu tordu comme question, mais est ce qu'on peut éviter de répéter le nom de la propre classe dans les méthodes enfants, et plutôt utiliser un terme générique ?
    Pas exemple, je fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public class tblGridGroups : IDataAccessServiceGroups {
            public static tblGridGroups OrEmptyIfNull(tblGridGroups source) {
                return source ?? new tblGridGroups();
            }
    }
    Est ce que ce ne serait pas possible de faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public class tblGridGroups : IDataAccessServiceGroups {
            public static typeof(this) OrEmptyIfNull(typeof(this) source) {
                return source ?? new typeof(this)();
            }
    }
    Dans l'idée bien sur, ca je sais que ceci ne compile pas.

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Salut,

    C'est tout a fait possible via generiques et encore mieux via methodes d'extentions:
    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 class tblGridGroups : IDataAccessServiceGroups
    {
    }
     
    public static class Extentions
    {
    	public static T OrEmptyIfNull<T>(this T source)
    		where T: IDataAccessServiceGroups, new()
    	{
    		return source ?? new T();
    	}
    }
     
    //utilisation
    IDataAccessServiceGroups plop;
    var plop2 = plop.OrEmptyIfNull();

  3. #3
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Bonjour mermich,

    Oui, j'utilise les méthodes d'extension, et c'est vrai que c'est pas mal.
    Alors, oui. Pour cet exemple ça peut coller car il n'y a pas de propriétés propriétaires à la classe dans la méthode, mais si je prend par exemple une fonction comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            /// <summary>Ajoute un élément à la BDD.</summary>
            /// <param name="u">Element à ajouter.</param>
            /// <returns>OK=Element ajouté, KO=null (le message d'erreur est dans vmBase).</returns>
            public static tblGroup Add(tblGroup u) {
                if ((u != null)) {
                    return Sauver(u.id, u.name, u.value); // Exemple grossier, pour simplifier.
                } else
                    return null;
            }
    Ça ne fonctionne plus, et même si on y arrive, il n'y a plus d’intérêt de mettre ça en méthode d'extension car chaque classe est gérée différemment, en fonction de ses propriétés.

    Tu parlais des génériques... peux tu détailler STP ?

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Je ne comprends pas, tu veux factoriser du code propre a chaque classes, et ensuite tu dis que ce n'est pas possible .

    Oui evidemenent, mais d'un autre cote je ne comprends pas ce que tu veux vraiment faire et ou tu veux en venir.

  5. #5
    Membre éprouvé Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 065
    Par défaut
    Non, je ne veux pas factoriser, Je veux juste remplacer le nom de la l'objet de la classe dans laquelle il se trouve par un terme générique (à la nameof, ...).

    En clair, de ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class tblGridGroups {
            public static tblGroup Add(tblGroup u) {
                if ((u != null)) {
                    return Sauver(u.id, u.name, u.value); // Exemple grossier, pour simplifier.
                } else
                    return null;
            }
    }
    Faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class tblGridGroups {
            public static typeof(this) Add(typeof(this) u) {
                if ((u != null)) {
                    return Sauver(u.id, u.name, u.value); // Exemple grossier, pour simplifier.
                } else
                    return null;
            }
    }
    Le typeof(this) n'existe pas, bien sur, mais c'est l'idée.
    Récupérer le type du conteneur via un accesseur et qui permette d'être utilisé comme type déclaratif.
    ... Je ne suis pas sur que ce soit plus clair expliqué comme ça... 0_0

    Dans mes classes objets, je répète une bonne 30aine de fois le nom de la classe, et je voulais optimiser ça (pour faciliter les copier/coller ou renommages par exemple).
    Juste savoir si un truc existait.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    Si toutes tes classes implémentent la même interface, tu peux utiliser cette interface comme type de retour.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/06/2009, 12h30
  2. définition de type dans une classe générique
    Par Benoit_T dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 16/03/2009, 17h24
  3. héritage et pointeur générique de type classe mere
    Par contremaitre dans le forum C++
    Réponses: 12
    Dernier message: 07/01/2009, 13h51
  4. Réponses: 4
    Dernier message: 30/01/2008, 14h45
  5. Conteneur générique et types des objets contenus
    Par bobuse dans le forum Langage
    Réponses: 4
    Dernier message: 12/04/2007, 11h59

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