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 :

[C#] Acceder a des informations d'une classe fille dans une methode static


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut [C#] Acceder a des informations d'une classe fille dans une methode static
    Bonjour,

    J'ai une classe A et une classe B.
    La classe B hérite de A.
    j'aimerai dans une méthode static défini dans la classe A acceder a des informations défini dans la classe B.

    Apres plusieurs essais je n'arrive pas a grand chose de bien concluant.
    L'impossibilité d'overrider les membres static est vraiment ...

    Un exemple de ce que j'aurai voulu faire : faire un GetType() sur l'objet de class B dans ma méthode static de A.
    J'ai reussi a le faire avec un généric :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class A<T> where T: new()
     
    class B : A<B>
    ensuite je fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T obj = new T();
    obj.GetType();
    Bon apres GetType() c une methode d'objet mais c une valeur arbitraire que j'utilise comme ID je peux mettre un ID en dur quelque part dans B, ca serai pas plus mal.

    Des idées ?

  2. #2
    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
    Salut,

    j'ai pas trop compris l'histoire du GetType() (apparement une ID generée a partir du type concret de l'objet ?), mais tu peux essayer avec un membre abstrait, genre :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
        class Program
        {
            static void Main(string[] args)
            {
                Trace.WriteLine(A.Truc(new B()));
                Trace.WriteLine(A.Truc(new C()));
            }
        }
     
        abstract class A
        {
            public abstract Type ID { get; }
     
            public static string Truc(A a)
            {
                return a.ID.ToString() ;
            }
        }
     
        class B : A
        {
            public override Type ID
            {
                get { return this.GetType(); }
            }
        }
     
        class C: A
        {
     
            public override Type ID
            {
                get { return this.GetType(); }
            }
        }
    Si je n'ai rien compris (ce qui est bien possible), pourrais tu donner plus d'infos ? =)

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    Bon ça va etre beaucoup plus clair si je donne le "but" de la maneuvre

    Voici ma classe "A" :

    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
    18
    19
        public abstract class Controller<TController> where TController : Controller<TController>, new()
        {
     
            public static TController Current
            {
                get
                {
                    TController controller = new TController();
                    string controllerKey = controller.GetType().ToString();
     
                    if (HttpContext.Current.Session[controllerKey] == null)
                    {
                        HttpContext.Current.Items[controllerKey] = controller;
                    }
                    return (TController)HttpContext.Current.Session[controllerKey];
                }
            }
    [...]
    }
    et ma classe "B"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public class SearchController : Controller<SearchController>
        {
    [...]
        }
    C'est du pseudo singleton sur le context http a l'aide d'une clef unique. Actuelement j'utilise le GetType de la classe mais faire un new a chaque current (une 15 ene de fois par requete alors qu'un seul suffirai) ce n'est pas top du tout

  4. #4
    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
    Pas besoin d'instancier l'objet pour connaitre la classe, tu peux passer plus simplement par un typeof(T), essaie peut etre comme ceci :

    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
    18
    19
    20
    21
    22
    23
    24
     
        public abstract class Controller<T> where T : Controller<T>, new()
        {
            public static T Current
            {
                get
                {
                    Type t = typeof(T);
                    T value;
                    if ((value = HttpContext.Current.Items[t.ToString()] as T) == null)
                    {
                        value = new T();
                        HttpContext.Current.Items[t.ToString()] = value;
                    }
     
                    return value;
                }
            }
        }
     
        public class SearchController : Controller<SearchController>
        {
     
        }
    En esperant que cela t'aide.

  5. #5
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Par défaut
    ah oki je pensais pas que ca marcher sur les generiques ... bien que ça ne resout pas ma question originel ça répond a pas mal de question à propos des generiques ça rend mon code bien meilleur merci

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2007
    Messages
    82
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 82
    Par défaut
    Et juste pour info, si tu te poses la question de savoir comment dans la classe A (ta classe mère) avoir accès aux membres de la classe B (classe fille), tu es en train d'implémenter un anti-pattern.
    Une classe mère ne doit pas avoir connaissance de ses enfants.

    La proposition de SirJulio est effectivement plus clean.

Discussions similaires

  1. Réponses: 15
    Dernier message: 01/03/2015, 13h16
  2. Réponses: 5
    Dernier message: 06/06/2013, 14h58
  3. Passage d'une classe mere a une classe fille
    Par khalid_kha dans le forum Langage
    Réponses: 2
    Dernier message: 17/04/2009, 11h52
  4. Réponses: 6
    Dernier message: 30/03/2009, 18h13
  5. Instanciation d'une classe fille depuis une classe mère
    Par khaled-benloucif dans le forum Langage
    Réponses: 2
    Dernier message: 30/01/2009, 23h59

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