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 :

Constructeur d'une classe générique


Sujet :

C#

  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 94
    Points
    94
    Par défaut Constructeur d'une classe générique
    Bonjour,

    J'ai la classe générique suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class MaGeneric<T> {
     
    }
    J'aimerai savoir s'il est possible de déclarer un constructeur prennant en parametre une instance de MaGeneric mais typé d'une dérivée de T. Quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public MaGeneric(MaGeneric<T0> mg) where T0 : T {
    }
    Admettons que j'ai deux classes : Mere et Fille telles que Fille dérive de Mere
    Je cherche à pouvoir faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaGeneric<Fille> filleG = new MaGeneric<Fille>();
    MaGeneric<Mere> mereG = new MaGeneric<Mere>(fille);
    Est-ce possible?

    Benjamin

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Si tu veux forcer le typage sur le constructeur de la classe mère je pense qu'il va falloir faire deux classe génériques différentes.


    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
     
        public class MaGeneric<T>
        {
        public MaGeneric()
        {
        }
        }
     
     
        public class MaGeneric<T, T0>
        where T : MaGeneric<T0>
        {
     
        public MaGeneric(T obj)
        {
        }
    Si bien que la déclaration change un peu, car la classe mère à besoin de connaître les deux types

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              MaGeneric<Fille> fille = new MaGeneric<Fille>();
              MaGeneric<MaGeneric<Fille>, Fille> Mere = new MaGeneric<MaGeneric<Fille>,Fille>(fille);

  3. #3
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Points : 94
    Points
    94
    Par défaut
    Hum, cette solution ne m'arrange pas trop, je voudrais éviter de faire une classe de plus.

    En fait j'ai déjà deux classes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class Maclass {
     
    }
     
    et 
     
    public class MaGeneric<T> : MaClass {
     
    }
    Pour l'instant je fais le meme genre de manip que tu me propose puisque j'ai un constructeur (dans MaGeneric<T>) qui prend un MaClass en parametre donc je peux mette une instance de MaGeneric de n'importe quel type et ca fonctionne. Je voulais savoir (principalement pour des soucis de restriction) si je pouvais faire autrement. Mais ca n'est pas très important

    Merci

    Benjamin

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/05/2009, 18h22
  2. [Débutant] Constructeur d'une classe
    Par chennuo dans le forum Langage
    Réponses: 2
    Dernier message: 10/03/2006, 22h17
  3. Réponses: 2
    Dernier message: 04/12/2005, 21h10
  4. Réponses: 5
    Dernier message: 20/11/2005, 11h15
  5. Réponses: 3
    Dernier message: 06/11/2005, 18h02

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