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 :

Visibilité des méthodes statiques d'une classe abstraite


Sujet :

C#

  1. #1
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 283
    Par défaut Visibilité des méthodes statiques d'une classe abstraite
    Salut

    je cherche à ce que les méthodes statiques d'une classe abstraite ne soient visibles que par les instances des classes dérivées...
    Donc une classe abstract A (ayant des méthodes statiques),
    dérivée B (les méthodes sont visibles)
    mais je ne veux pas qu'on puisse A.LaméthodeStatique

    Merci par avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    IMPOSSIBLE.

    Pourquoi tu ne veux que ça soit visible par A.
    vu que A est abstraite, la méthode n'est pas réellement appelée sur A mais sur une classe dérivée implémentant toutes les méthodes abstraites de A.

  3. #3
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 283
    Par défaut
    Merci

    Je ne veux pas qu'on puisse utiliser les méthodes statiques de la classe abstraite mais uniquement celles de la classe dérivée

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mappy Voir le message
    C'est suprenant tout de même que c# n'ait pas pensé à çà...
    il me semble que c'est pareil pour tous les langages OO.
    A moins que tu me donnes un langage qui le permet.

    P.S.: j'avais pas remarqué aussi que tu parlais des méthodes statiques, je pensais aux méthodes d'instances.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 283
    Par défaut
    abstract maclasse
    static mamethode


    maclassederivee:maclasse
    je vois maméthode



    je ne veux pas qu'un appel à maclasse puisse faire maclasse.mamethode.

    En gros, forcer à utiliser la classe dérivée

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je rectifie mon tir c'est possible.

    Un peu de bidouaillage qui ne fait aucunement parti des BONNES PRATIQUES et donc n'est pas recommandé.
    • La solution est de rendre la méthode statique dans la classe A protected.
    • De rédéfinir la méthode dans la classe dérivée B en utilisant le mot new, et dans l"implémentation de la méthode faire appel à la méthode statique de A.

    Exemple :
    Code C# : 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
    public abstract class A
    {
    	protected static void MethodeStatique()
    	{
    		// traitement
    	}
     
    	public abstract void MethodeAbstraite();
    }
     
    public class B : A
    {
    	public override void MethodeAbstraite()
    	{
    		// traitement
    	}
     
    	public new static void MethodeStatique()
    	{
    		A.MethodeStatique();
    	}
    }
    NOTA BENE : si t'as une autre classe C dérivée de B, impossible de restreindre l'accés à la méthode statique de B vu que cette dernière est publique.

  7. #7
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Salut,
    On ne peut pas modifier la visibilité d'un membre. Cependant, rien ne nous empêche de l'encapsuler.
    L'astuce pour parvenir à tes fins est donc la suivante :
    Code c# : 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
     
    public abstract class ClassMere
    {
        public abstract void UneMethode();
        protected static int UneMethodeStatique() { return 12; }
    }
     
    public class ClassFille : ClassMere
    {
        public override void UneMethode() { /* implémentation de la méthode abstract */ }
     
        public static int MethodeStatiqueSurClassFille() { return ClassMere.UneMethodeStatique(); }
    }
     
    public class test
    {
        public void MethodeTest()
        {
            ClassMere.UneMethodeStatique(); // ERREUR la méthode n'est pas accessible d'ici.
            ClassFille.MethodeStatiqueSurClassFille(); // Ca fonctionne
        }
    }

    EDIT: bah le temps de l'écrire je me suis fait graillaid...

  8. #8
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 283
    Par défaut
    merci, je vais tester. Etonnant qu'il n'y ait pas un mot clé qui puisse faire ça propre.

  9. #9
    Invité
    Invité(e)
    Par défaut
    ctxnop, il est recommandé d'uiliser le mot clef new, sinon t'auras un avertisssement lors de la compilation te signalant mias ça compile quand même.

    mappy, il faut que t'utilises le mot clef new pour ne pas avoir l'avertissement.

  10. #10
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    ctxnop, il est recommandé d'uiliser le mot clef new, sinon t'auras un avertisssement lors de la compilation te signalant mias ça compile quand même.
    Euh non, pas d'avertissement avec mon code. L'astuce consiste à un nom de méthode différent J'avais pourtant mis un nom bien différent pour bien montrer que les méthodes n'étaient pas nommées pareil
    Si tu utilises le même nom, là oui, il faut utiliser new.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Euh non, pas d'avertissement avec mon code. L'astuce consiste à un nom de méthode différent J'avais pourtant mis un nom bien différent pour bien montrer que les méthodes n'étaient pas nommées pareil
    Si tu utilises le même nom, là oui, il faut utiliser new.
    j'avais pas remarqué l'astuce.

  12. #12
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Euh? Le problème de base, on en a plusieurs fois discuté sur ce forum, n'a pas de sens! Une méthode statique n'est pas héritée (et n'a pas à être héritée) !

  13. #13
    Membre éclairé
    Inscrit en
    Février 2006
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 283
    Par défaut
    je ne parlais pas d'instance mais juste de la visibilité d'une méthode statique issue d'une classe abstraite

  14. #14
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par PitMaverick78 Voir le message
    Euh? Le problème de base, on en a plusieurs fois discuté sur ce forum, n'a pas de sens!
    d'accords avec toi.

    Citation Envoyé par PitMaverick78 Voir le message
    Une méthode statique n'est pas héritée (et n'a pas à être héritée) !
    Un peu confus.
    Si ce que tu dis est vrai pourquoi quand on définit la méthode statique pour une classe de base A, cette méthode statique est accessible via la classe dérivée B.
    Et là je viens de m'appercevoir qu'on peut même jouer sur la visibilité des méthodes statiques de la classe de base A dans les classes dérivées comme on le fait avec les méthodes d'instances.

  15. #15
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Cf la doc http://msdn.microsoft.com/en-us/library/79b3xss3.aspx

    Static methods can be overloaded but not overridden, because they belong to the class, and not to any instance of the class.

  16. #16
    Invité
    Invité(e)
    Par défaut
    traduit en français ça donne :
    Les méthodes statiques peuvent être surchargées mais non substituées, car elles appartiennent à la classe, et non à une instance de la classe.
    La surcharge des méthodes statiques c'est très logique et là n'est pas la question.
    Je reformule grâce au lien que t'as fournit :
    Puisqu'une méthode statique ne peut être substituée alors dis moi pourquoi je suis arrivé à le faire avec l'exemple de code que j'ai fournit précédemment et qu'aucune erreur de compilation ne m'en a empêché ?

  17. #17
    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 h2s84 Voir le message
    Puisqu'une méthode statique ne peut être substituée alors dis moi pourquoi je suis arrivé à le faire avec l'exemple de code que j'ai fournit précédemment
    Parce que tu ne l'as pas fait. Tu n'as fait que créer une méthode ayant le même nom, mais qui n'a aucun rapport hiérarchique avec l'autre (et pour cause, elles sont statiques).
    Le seul truc que ça change, c'est qu'à l'intérieur de la classe fille, cela force à préfixe par le nom de la classe mère l'appel de la méthode mère si c'est vraiment elle (et pas elle définie dans la classe fille avec le même nom) que l'on veut appeler, alors que si tu n'avais pas créé de méthode du même nom, le compilo aurait trouvé tout seul qu'elle se trouvait dans la mère.

    La seule chose quie ressemble vaguement à de l'héritage dans l'histoire, c'est que le compilo C# permet que l'on appelle une méthode statique "Methode()" définie dans une classe "Mère" via Fille.Methode(), si fille hérite de Mère. FxCop n'aime pas trop, d'ailleurs.
    Donc là oui, le sens de Fille.Méthode sera différent si elle a sa propre "Méthode" (déclarée avec new)

    Enfin bref, on en a déjà parlé récemment ici : si on veut du code surchargeable par de l'héritage, on ne fait pas du statique. Parce que, comme son nom l'indique, le statique est statique (si), et le compilo sait statiquement (c'est à dire dès la compilation) quelle méthode appeler, il n'y a pas de place pour de la surcharger dynamique en fonction du contexte.

  18. #18
    Invité
    Invité(e)
    Par défaut
    J'aime bien quand on m'explique.
    Seul problème : il faut longuement expliqué pour que ça rentre dans ma tête.

    +1, Guulh.
    un truc de plus à mettre dans mes notes personnelles.

Discussions similaires

  1. Appel des fonctions statiques d'une classe
    Par damien12345 dans le forum C++
    Réponses: 7
    Dernier message: 31/10/2012, 19h27
  2. recuperer la liste des propriétés statiques d'une classe ?
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 22/11/2009, 13h50
  3. Réponses: 0
    Dernier message: 20/10/2009, 19h09
  4. Réponses: 2
    Dernier message: 17/05/2009, 01h31
  5. Réponses: 2
    Dernier message: 27/03/2005, 17h09

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