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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

  9. #9
    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.

Discussions similaires

  1. Appel des fonctions statiques d'une classe
    Par damien12345 dans le forum C++
    Réponses: 7
    Dernier message: 31/10/2012, 18h27
  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, 12h50
  3. Réponses: 0
    Dernier message: 20/10/2009, 18h09
  4. Réponses: 2
    Dernier message: 17/05/2009, 00h31
  5. Réponses: 2
    Dernier message: 27/03/2005, 16h09

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