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

Framework .NET Discussion :

[Generics] Surcharges de fonctions avec generiques


Sujet :

Framework .NET

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut [Generics] Surcharges de fonctions avec generiques
    Bonjour à tous,

    J'ai voulu faire une surcharge de fonction avec des génériques mais je me rend compte que cela réagit plutot mal.
    Voici en gros ce que j'aurais souhaité faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function GetMyResult(of T as {new, IResultBase})() as T
    public function GetMyResult(of T as {new, IResultExtended1})() as T
    public function GetMyResult(of T as {new, IResultExtended2})() as T
    Ce qui m'aurait permis d'avoir une seule fonction dans laquelle j'injecte le type de résultat attendu et du coup je récupère le resultat en question.
    Bon j'avoue, l'interet de la chose est purement "graphique" dans le sens où cela permet juste d'avoir une meilleure lisibilité du code et surtout d'avoir un meilleur confort de code car je pourrais très bien créer trois fonctions portant des noms différents.

    Bref, auriez vous une idée sur le sujet à savoir s'il est possible de créer des surcharges uniquement différenciées par le type de base que T doit avoir via la contrainte imposée dans la signature ?

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Est-ce que c'est ça que tu cherches à faire ?
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public T GetMyResult<T>(T myParam)
        where T : IResultBase, IResultExtended1, IResultExtended2, new ()
    {
    }

    [EDIT] : je viens de tester et ça n'a pas l'air de fonctionner tel quel Pas le temps de voir tout de suite pourquoi, mais est-ce que ça répondrait à ta question ?
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Points : 377
    Points
    377
    Par défaut
    En fait, c'est ce que j'avais fait au départ.
    Mais trois choses m'ennuient avec cette méthode (au niveau propreté du code) :

    1) Si tu as 10 interfaces qui héritent de IResultBase, tu les auras dans la signature, avec 30 ou 40 surcharges, je te raconte pas le bordel...

    2) Dans la fonction tu es obligé de tester le type de T avec des if elseif pour faire la construction du T en fonction de l'interface employée concretement

    3) Au moment de l'instanciation de T, l'intellisense te proposera la liste complète de toutes les propriétés de toutes les interfaces => pas glop :/

    D'où le fait de vouloir faire une surcharge de la fonction, ce qui était beaucoup plus propre à mon gout.
    J'ai fait un peu le tour du web et il n'y a pas de possibilité de surcharge comme je souhaite le faire car le typage générique et ses contraintes n'entrent pas dans la définition de la signature. Donc les fonctions ont du coup la même signature et ça ne passe donc pas.
    Je ne sais pas trop comment faire à part utiliser des noms de fonctions différents à chaque fois.

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Points : 460
    Points
    460
    Par défaut
    Bonjour,

    Je ne vois pas trop l’intérêt d'utiliser les interfaces dérivées?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public T GetMyResult<T>(T myParam)
        where T : IResultBase, new()
    {
    }
    Devrait suffire du point de vue de la déclaration.

    Après si tu as besoin de faire des choses spécifique au niveaux de l'initialisation en fonction de l'interface réel, alors il faudra bien faire des if.

    Dans la fonction tu es obligé de tester le type de T avec des if elseif pour faire la construction du T en fonction de l'interface employée concretement
    Bah oui, meme en temps c'est les prémisse d'une factory.
    D'ailleurs selon ce que tu cherches a faire, une factory, voir une abstract factory c'est peut être plus adapté.

Discussions similaires

  1. Surchargé une fonction template avec template
    Par SKone dans le forum Langage
    Réponses: 2
    Dernier message: 12/10/2014, 20h00
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. surcharge de fonction avec comme paramètre Object
    Par poporiding dans le forum C++
    Réponses: 8
    Dernier message: 14/07/2006, 03h47
  4. Appeler une fonction avec/sans parenthèses
    Par haypo dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 29/12/2002, 18h48
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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