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

Dotnet Discussion :

Generics et surcharge


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut Generics et surcharge
    Hello tout le monde

    Voilà le problème

    J'ai une classe qu'on va appeler Common
    J'ai 2 classes A et B qui héritent de Common

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class A : Common
    {}
     
    public class B : Common
    {}
    J'ai une méthode avec une surcharge pour chacune des classes précédentes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void Fill(IDataReader dr, A value)
    {}
     
    public void Fill(IDataReader dr, B value)
    {}
    J'ai une méthode Generic de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public T GetById<T>(long id) where T : Common, new()
    {
         // requete en base qui fournit un datareader
         ....
     
         // On fill l'objet avec les valeurs du dr
         Fill(dr, T);
    }
    Et biensûr ça compile pas et je comprends.
    Mais comment indiquer la bonne surcharge de Fill à utiliser?

    Merci

  2. #2
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    C'est normal que ca ne compile pas. tu as passé le type et non pas la valeur.
    Je ne sais pas comment est agencé ta méthode générique, mais si tu regarde tes méthodes Fill elle reçoivent un paramètre valorisé et non pas un type.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public T GetById<T>(long id) where T : Common, new()
    {
        // requete en base qui fournit un datareader
        ....
     
        T val = ???; // C'est à toi de déterminer comment tu valorise le paramètre
     
        // On fill l'objet avec les valeurs du dr
        Fill(dr, val);
     
        // Tu peux aussi, si jamais tes méthodes le supportent, passer null
        Fill(dr, (T)null);
    }

    Edit: Ah oui, je précise au cas où qu'en plus méthode doit retourner un objet typé T.

  3. #3
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Yep, j'ai pas tout écrit, j'ai ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var result = new T();
    Fill(dr, result);

  4. #4
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Et le message d'erreur du compilateur il dit quoi ?

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Par défaut
    Invalid argument dans l'appel de la surcharge

  6. #6
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Common n'est pas de type A, ni de type B.

    Donc Fill(Common), ça marche pas normal. Les types correspondent pas.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Dans une optique pure POO (c'est à dire en évitant un switch case moche sur le type), il faudrait que GetById<T> soit dans une classe générique<T>, et appelle une méthode abstract Fill(Datareader dr, T item) ; après, ce sont des classes filles non génériques qui overrident Fill pour un type T donné.

    Mais ça t'oblige d'avoir une instance par type d'objet Common, ce qui peut t'obliger à revoir pas mal de choses dans ton code.

  8. #8
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Func<IDataRecord, T> GetFiller<T>()
    {
    	var p = Expression.Parameter(typeof(IDataRecord));
    	return Expression.Lambda<Func<IDataRecord, T>>(
    		Expression.MemberInit(Expression.New(typeof(T)),
    			typeof(T).GetProperties().Select(pi =>
    				Expression.Bind(pi, Expression.Convert(
    					Expression.Property(p, "Item", Expression.Constant(pi.Name)),pi.PropertyType
    				))
    			)
    		)
    	, p).Compile();
    }

Discussions similaires

  1. [Generics] Surcharges de fonctions avec generiques
    Par zax-tfh dans le forum Framework .NET
    Réponses: 3
    Dernier message: 03/07/2013, 11h12
  2. Generic Vs Surchargement methode
    Par soony dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 07/04/2009, 20h14
  3. Réponses: 5
    Dernier message: 24/04/2003, 11h47
  4. Surcharger le message d'erreur après un OnException
    Par Tirlibibi dans le forum XMLRAD
    Réponses: 2
    Dernier message: 24/04/2003, 11h42
  5. Réponses: 8
    Dernier message: 20/11/2002, 11h50

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