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érics et constructeur


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Par défaut Générics et constructeur
    Bonjour,

    Le code suivant me provoque cette erreur de compilation :
    "'T': cannot provide arguments when creating an instance of a variable type."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public class MyList<T>
            where T : MyObjectBase, new()
        {
            public void Test()
            {
                T Myobj = new T("Test");
            }
     
        }
    Or les types que je fournirais pour T ont un constructeur avec 1 argument de type string.

    Existe-t-il une syntaxe (hormis la réflexion) pour permettre de spécifier une signature de constructeur obligatoire sur le type T ?

    Est-il possible d'ailleurs à une classe de dire qu'elle implémente une certaine signature de constructeur, et d'obliger tous les descendant de cette classe d'implémenter cette signature de constructeur ?

    Merci d'avance.

    Sybaris

  2. #2
    Membre Expert Avatar de Tober
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 824
    Par défaut
    peut etre en mettant un constructeur comme tu veux dans MyObjectBase en virtuel...

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Bonjour,

    en un mot, non il n'est pas possible d'obliger une derivation d'implementer un constructeur specifique, et in extenso dans la norme actuelle, on ne peut que specifier qu'un constructeur par defaut sur des constraintes de genericité.

    Pour resoudre ton probleme, mais tu es deja au courant apparement, il reste la reflexion.

    Bon courage.

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Par défaut
    Bonjour,

    Merci pour vos réponse.
    J'ai donc adopté comme solution d'utiliser la réflexion

    Mon code est du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
                ConstructorInfo[] ci = typeof(T).GetConstructors();
                object[] parameters;
                parameters = new object[] { "Test" };
                T Myobj  = (T)ci[0].Invoke(parameters);
    Je ne trouves pas cela très propre, ni très optimisé, mais bon... Des fois faut être pragmatique...

    Je pense qu'il serait utile que le Framework dotnet rajoute une fonctionnalité "interface de constructeur".
    Une "interface de constructeur" définirait une signature de constructeur.
    Une classe de base qui implémenterait cette "interface de constructeur" obligerait toutes ses classes descendante à l'implémenter aussi...

    Qu'en pensez vous ?

    Sybaris

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Je vois pas l'intérêt. Si vraiment le fait d'obtenir une objet à partir d'une chaîne est la caractéristique qui t'intéresse, tu peux imaginer une interface du style IConvertibleFromString<T> avec une méthode T FromString(string s).

  6. #6
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    Mai 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2008
    Messages : 118
    Par défaut
    Bonjour,

    Ici l'argument du constructeur est une chaine de caractère uniquement pour exemple.

    L'intérêt de préciser des paramètres à un constructeur est par exemple d'obliger de fournir des informations ou des objets,et de vérifier leur validité 1 fois pour toute dans le constructeur.

    L'alternative est d'avoir un constructeur sans paramètre et autant de propriétés. Cependant, la validation devra être faite à chaque méthode "sensible" ou à chaque accesseur de propriété. Cela peut devenir très rapidement pénible...

    Bref, pouvoir imposer une signature de constructeur me parait être quelque chose d'utile...

    Sybaris

Discussions similaires

  1. [Reflection] Récupérer un constructeur ayant un paramètre int
    Par narmataru dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/07/2004, 09h53
  2. [VB6]Déclaration d'un Constructeur Spécialisé
    Par TagadaTsoin dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 26/05/2004, 14h09
  3. [Constructeur]Pb avec la surcharge d un constructeur
    Par cmoulin dans le forum Langage
    Réponses: 3
    Dernier message: 26/04/2004, 09h29
  4. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52
  5. pb constructeurs classes dérivant classe abstraite
    Par Cornell dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2003, 19h02

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