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 :

Instance d'une classe avec une string


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 36
    Par défaut Instance d'une classe avec une string
    Bonjours à tous,

    Je souhaiterais instancier l'objet d'une classe dont le nom serait connu uniquement dans une variable string...

    Je sait que ce problème a déja été traité maintes fois sur ce forum ou même partout ailleurs.

    Malheureusement, j'ai eu quelques difficultés en ce qui concerne l'interprétation, voire la compréhension des info que j'ai pu recueillir sur le sujet !

    Je vais clairement expliquer le but de la manoeuvre, à présent...

    --> Dans un programme C#(mode console), je dispose des classes suivantes:
    1 - classe program : qui contient les méthodes (actions: lister, ajouter, miodifier, etc...) communes à tout cas d'utilisation !
    2 - classe mère "Article" : c'est la classe mère qui possède des méthodes et des attributs commun à toutes les classes fille !
    3 - plusieurs classes filles telle que "ArticleAcheté" : ces classes possèdes des attributs et méthodes qui leur sont spécifiques, et peuvent évidement accéder aux attributs et méthodes(virtual-override) commun de la classe mère...

    Sachant, que les actions (méthodes : lister, ajouter, modifier, etc...), se trouve dans la classe Program, voici l'exemple précis de mon cas d'utilisation:
    --> pour la fonction Lister :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string nomClass = "ArticleAcheté";
    static public void LISTER (string nomClass)
    {
    nomClass toto = new nomClass();
    ....
    }
    Dans cet exemple, l'objet nouvellement crée "toto", devrait se voir appliquer les méthodes et attributs de la classe fille "ArticleAcheté"...
    Cependant, mon exemple est faux : en effet, on ne peut pas instancier un objet directement avec une variable string !

    Par conséquent, je recherche actuellement le moyen de créer l'objet dit "toto", a partir de la variable string "nomClass", laquelle contient le nom de la classe à instancier pour l'objet "toto" !

    De cette manière, l'objet "toto" devrait se voir affecter tout les attributs et méthodes de la classe fille "ArticleAcheté"...

    --> Exemple : Si la classe fille "ArticleAcheté" possède des méthodes spécifiques telles ques : afficher(), saisir(), getFournisseur(), etc...
    Alors, on pourrait faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto.afficher();
    toto.saisir();
    toto.getFournisseur();
    Voila, j'espere avoir été le plus explicite possible...

    Je reste dès à présent ouvert à toutes suggestions...

    Je vous remercie par avance, pour toute l'aide que vous pourrez m'apporter...

  2. #2
    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
    Oula, tu te compliques la vie
    Etant donné que dans ta méthode "Lister", tu veux utiliser des méthodes propres à ton objet "ArticleAcheté", elle est fortement lié à cette classe ; tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void ListerArticleAcheté()
    {
    ArticleAcheté toto = new ArticleAcheté();
    toto.
    }
    Tu vois ce que je veux dire ? pourquoi tu veux rendre générique une méthode, alors qu'elle ne manipulera qu'un seul type d'objet ?

    Sinon, connais-tu les generics ? Ca permet de paramétrer une méthode par type, c'est très puissant, joli, et tout

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 36
    Par défaut
    En fait, si je procéde comme l'extrait de code, je suis obligé de nommé explicitement la classe (ArticleAcheté), pour laquelle mon objet va être instancié...

    Mais je dispose de nombreuses classes filles, il n'y a pas que la classe fille "ArticleAcheté" en fait...

    Par conséquent, cela voudrait dire qu'il y aurait autant d'objet à instancier que de classe fille, et le code de la méthode Lister (dans mon exemple), devrait être recopier autant de fois qu'il y aurait d'objet différent...
    Imagine le rendu dans une architecture de type Framework !!

    Je veux simplement rendre les éléments plus modulaire et indépendant, en instanciant un objet, pour une classe donnée à partir de son nom (lequel est fournie uniquement dans une variable string, passé en paramètre à la méthode appelante)

    Autre bémol, la méthode ne peut pas s'appeler "ListerArticleAcheté", étant donné qu'elle ne listera pas que des éléments de la classe "ArticleAcheté", mais de toutes les classes filles !

  4. #4
    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 beetlejuice722 Voir le message
    Dans cet exemple, l'objet nouvellement crée "toto", devrait se voir appliquer les méthodes et attributs de la classe fille "ArticleAcheté"...
    Donc t'es bien d'accord que dans méthode Lister, tu vas appeler des méthodes propres à ArticleAcheté ?

    Sinon, comme je te disais, les generics devraient satisfare ton besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static void Lister<T>() where T : Article, new()
    {
      T toto = new T(); // possible grâce à la contrainte new() sur le type T
      toto.afficher(); // possible grâce à la contrainte d'héritage sur T
      ...
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 36
    Par défaut
    Je suis tout à fait d'accord avec ton exemple...

    Je l'ai testé, mais avec cette manière l'objet toto, n'aurait pas accès aux attributs et méthodes spécifiques des classes fille, telle que "getFournisseur()" pour la classe fille "ArticleAcheté" !

    N'y a t-il pas un moyen pour passé en paramètre la classe à instancier (Article dans ton exemple), sans qu'elle soit désigné explicitement ?

    quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    string maClasseFille = "ArticleAcheté";
    // Ou n'importe quel autre nom de classe fille : il n'y a pas que "ArticleAcheté"
    public static void Lister<T>() where T : maClasseFille, new()
    {
      T toto = new T(); // possible grâce à la contrainte new() sur le type T
      toto.getFournisseur(); // appel d'une méthode spécifique à une classe fille
      ...
    }
    En tout cas, je te remercie de m'aider dans mon problème !

  6. #6
    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 reprends ce que je disais tout à l'heure.

    Tu veux appeler des méthodes propres à la classe fille dans Lister. Donc t'es bien d'accord que Lister est "propre" à ta classe fille ? Que tu vas toujours l'appeler comme ça : Lister("ArticleAcheté"), puisque sinon tu pourras pas appeler getFournisseur, puisque sinon ton toto sera autre chose qu'un ArticleAcheté ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. Réponses: 9
    Dernier message: 08/07/2009, 17h10
  5. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43

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