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 & méthodes génériques


Sujet :

C#

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut Classes & méthodes génériques
    Bonjour,
    je n'ai jamais utilisé les génériques et j'ai un peu de mal à appréhender le concept, alors je ne sais pas si l'utilisation que j'en fais ici est la bonne.
    J'ai créé une méthode générique qui manipule des objets Movie, Book, Music héritant tous d'une classe Media:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static partial class WebDataQuery
     { 
    public static T GetMedia<T>(T item) where T : Media
        {
        }
    }
    Cette méthode doit faire des traitements internes en appelant d'autres classes (privées à WebDataQUery) qui, elles sont spécifiques et ne traitent qu'un seul type d'objet: Movie, Book, Music...
    Selon le type de item, je dois donc appeler l'une de ces classes DataHelpers:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static T GetMedia<T>(T item) where T : Media
    {
        if (typeof(T) == typeof(Movie))
        {
            DataHelpers.MyMovieHelper.GetData((Movie)item);
        }
    }
    La méthode DataHelpers.MyMovieHelper.GetData() ne traite donc que des objets Movie et renvoie un objet Movie.

    Seulement j'ai une erreur sur (Movie)item : Cannot convert type 'T' to 'Movie'

    Comment dois-je procéder ?

    Pour être plus clair, le tout s'articule ainsi:
    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 static partial class WebDataQuery
    { 
       public static T GetMedia<T>(T item) where T : Media
       {
            if (typeof(T) == typeof(Movie)) { DataHelpers.MyMovieHelper.GetData((Movie)item);}
       }     
        
    
        private static class DataHelpers
        {        
            public static Class MyMovieHelper
            {         
                public static Movie GetData(Movie mymovie) { return mymovie;}
            }
        }
    }

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Août 2006
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 582
    Points : 265
    Points
    265
    Par défaut
    J'ai trouvé le moyen de contourner le problème:
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static T GetMedia<T>(T item) where T : Media
    {
        if (typeof(T) == typeof(Movie))
        {
            object themovie = item;
            themovie = (Movie)themovie;
            DataHelpers.MyMovieHelper.GetData(themovie);
        }
    }

    Puis, en réfléchissant, j'ai décidé de passer l'objet Movie à DataHelpers.MyMovieHelper.GetData() par référence (en effet, cette méthode recevait un objet Movie pour en modifier les propriétés et retourner un nouvel objet Movie avec les propriétés modifiées).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static T GetMedia<T>(T item) where T : Media
    {
        if (typeof(T) == typeof(Movie))
        {
            object themovie = item;
            Movie themov = (Movie)themovie;
            DataHelpers.MyMovieHelper.GetData(ref themov);
            return themov;
        }
    }
    Donc ma méthode GetMedia<T>(T item) doit retourner un objet Movie, mais là, même problème: le return themov; indique une erreur : Cannot implicitely convert 'Movie' to 'T'
    return (T)themov; indique aussi une erreur.
    J'ai contourné ceci ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static T GetMedia<T>(T item) where T : Media
    {
        if (typeof(T) == typeof(Movie))
        {
            object themovie = item;
            Movie themov = (Movie)themovie;
            DataHelpers.MyMovieHelper.GetData(ref themov);
            themovie = (object)themov;
            return (T)themovie;
        }
    }
    Mais tout ceci m'a l'air quelque peu bancal... Est-ce la bonne façon de procéder ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/06/2011, 23h13
  2. Réponses: 2
    Dernier message: 07/12/2009, 16h50
  3. Réponses: 2
    Dernier message: 06/03/2009, 09h52
  4. Pointeurs de classes et méthodes
    Par insomniak dans le forum C++
    Réponses: 9
    Dernier message: 10/05/2006, 15h18
  5. Déclaration de classes et méthodes externes
    Par rulianf dans le forum C++
    Réponses: 6
    Dernier message: 15/09/2005, 15h26

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