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#

  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

  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 : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Citation Envoyé par sybaris Voir le message
    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.
    Je suis d'accord que ça pourrait avoir du sens pour les objets immutable, qui ne sont plus modifiables après leur construction.

    Citation Envoyé par sybaris Voir le message
    Bref, pouvoir imposer une signature de constructeur me parait être quelque chose d'utile...
    Les langages objets que je connais (C++, C#, java) ont pas mal en commun dans la gestion des constructeurs. Notamment le fait qu'ils ne sont pas hérités. Le fait d'avoir une contrainte "new()" dans la définition d'un type générique est déjà un peu limite limite, puisqu'elle peut être vérifiée par un type A1 mais mas par un type A2 qui hérite de A1.

    Je lisais sur je sais plus quel blog que pour ces histoires de contraintes (mot-clé where), les concepteurs de C# se demandaient jusqu'où ça valait la peine d'aller dans le pattern matching. Tu peux imaginer quelque chose de bien plus puissant, mais risqué : tu pourrais forcer un type à avoir une certaine propriété, une certaine méthode, ...

  8. #8
    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,

    En Delphi par exemple il y a possibilité d'hériter d'un constructeur...
    Et grâce aux méta classe en delphi, il est possible d'appeler ce constructeur sur une classe dont le type est fixé à l'exécution.

    En .net pour faire cela, il faut utiliser la réflexion...

    Sybaris

  9. #9
    Expert confirmé
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Par défaut
    Perso je me serai suffit de celà :
    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 MyList<T>
            where T : MyObjectBase, new(), IInitializable
        {
            public void Test()
            {
                T Myobj = new T();
                Myobj.Initialize("Test");
            } 
        }
     
    public interface IInitializable
    {
      void Initialize(string param);
      bool Initialized{get;}
    }
    ///

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par Guulh Voir le message
    Tu peux imaginer quelque chose de bien plus puissant, mais risqué : tu pourrais forcer un type à avoir une certaine propriété, une certaine méthode, ...
    Ben ça on peut le faire, il suffit de mettre une interface dans les contraintes

  11. #11
    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
    Oui, mais je pensais aux cas où on manipule des classes existantes.

    Le framework a déjà ce genre de comportemnts, parfois : le foreach fonctionne avec tout objet ayant une méthode GetEnumerator(), les initialisateurs de listes fonctionnent (en C#3) avec tout objet ayant une méthode Add, ...

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