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 :

Rendre une méthode de la classe mère inaccessible


Sujet :

C#

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut Rendre une méthode de la classe mère inaccessible
    J'ai une classe mère à laquelle je ne peux pas toucher avec un méthode toute pourrie.
    Je voudrais, par sûreté, rendre cette méthode inaccessible à partir des classes filles que je vais écrire.

    Y - a - t - il un moyen ?

    merci

  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
    C'est pas super précis... En gros t'as une classe A avec une méthode (publique ?) M ; et une class B qui hérite de A.
    Une instance de B étant une instance de A, elle a toutes les méthodes de A. Donc non, c'est pas possible.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut
    Ok mais A peut choisir de rendre certaines de ces méthodes invisibles aux autres classes (avec private par exemple).

    Donc oui la méthode est public en A mais j'aimerai qu'elle ne le soit pas en B.

  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
    Pas possible. Une instance de B est une instance de A, donc une instance de B doit pouvoir faire tout ce qu'une instance de A peut faire, y compris proposer l'appel de ta méthode "pourrie".

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par piotrr Voir le message
    Ok mais A peut choisir de rendre certaines de ces méthodes invisibles aux autres classes (avec private par exemple).

    Donc oui la méthode est public en A mais j'aimerai qu'elle ne le soit pas en B.
    Faudrait savoir : tu dis plus haut que tu ne peux pas toucher à ta classe A.

    Et une méthode publique, ben ... c'est une méthode publique; il n'y a pas de "public restreint". (et c'est logique).

    Au demeurant, on arrive à faire l'inverse, rendre publique entre deux assemblies des méthodes internal (avec un atttribut particulier de l'assembly).

  6. #6
    Membre expérimenté

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 215
    Par défaut
    Tu peux tester (avec this.getType().ToString()) la classe de l'objet qui appelle la méthode, pour empêcher qu'elle s'exécute pour un objet qui ne serait pas de la classe de base.

    Tu peux aussi mettre des commentaires /// qui apparaîtront dans la documentation de la méthode, et y expliquer que cette méthode ne fonctionne que pour la classe de base.

    Mais tu ne pourras pas empêcher que la méthode soit visible dans les classes héritées.

  7. #7
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Citation Envoyé par michel.bosseaux Voir le message
    Tu peux tester (avec this.getType().ToString()) la classe de l'objet qui appelle la méthode, pour empêcher qu'elle s'exécute pour un objet qui ne serait pas de la classe de base..
    Il a dit qu'il ne voulait pas toucher à la classe en question; de manière externe il n'existe (logiquement) pas de solution (le contraire serait un comble si on pouvait modifier la visibilité des éléments d'un objet de manière externe à cet object - la demande est quand même curieuse).

  8. #8
    Membre expérimenté

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 215
    Par défaut
    de manière externe il n'existe (logiquement) pas de solution (le contraire serait un comble si on pouvait modifier la visibilité des éléments d'un objet de manière externe à cet object - la demande est quand même curieuse).
    je crois que la POA (programmation orientée aspect) permettrait des choses de ce genre, mais ça devient vraiment TROP compliqué...

  9. #9
    Membre expérimenté
    Inscrit en
    Octobre 2007
    Messages
    236
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Octobre 2007
    Messages : 236
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        public class Test
        {
            [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
            public override string ToString()
            {
                throw new NotImplementedException();
            }
        }
    Si la classe Test est créé dans une Class Library l'attribut au dessus de la méthode surchargée de la classe Objet rendra ToString invisible dans l'éditeur et aussi dans l'explorateur d'objet, cependant, Test.ToString() est acceptée par le compilateur et ne génére aucune erreur ni exception

  10. #10
    Membre expérimenté
    Avatar de Rami
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 177
    Par défaut
    Si elle est si "pourrie", tu peux faire de l'occultation (voir de la redefinition suivant comment la méthode originale est declarée) et re-écrire une methode "propre" dans ta classe B qui masque la "pourrie" (ou à defaut d'une réimplementation renvoyer une erreur type "deprecated" pour empécher "l'execution")

    Ca ne change pas la visibilité mais ca peut resoudre ton affaire (depends de tes contraintes et de ce que tu veux vraiment faire)...

    PS:
    cross posting

    PPS:
    Tiens, apres une petite lecture, pas sur que les mécanismes d'occultation soit completement symetrique entre VB.Net et C#... à creuser...

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut
    Citation Envoyé par Bluedeep Voir le message
    Faudrait savoir : tu dis plus haut que tu ne peux pas toucher à ta classe A.

    Et une méthode publique, ben ... c'est une méthode publique; il n'y a pas de "public restreint". (et c'est logique).
    Je n'a pas accès au code de la classe A.

    J'ai exprès hérité cette classe pour pouvoir utiliser mes propres objets avec uniquement les méthodes dont j'ai besoin.

    Parce qu'il y a beaucoup de choses dans la classe mère mais tout n'es pas utile pour les futurs utilisateurs.

    Donc j'aimerai fournir des classes personnalisées par mes soins et rendre uniquement accessibles les méthodes et les propriétés que j'aurai décidé.

  12. #12
    Membre chevronné
    Inscrit en
    Décembre 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Décembre 2008
    Messages : 256
    Par défaut
    Ce que tu veux faire est possible, mais il te faut utiliser la composition et non l'héritage :

    Ta classe B utilise un membre privé A. Pour chacune des méthodes de A que tu veux exposer, tu définis une méthode dans B qui appelle celle de A.
    De cette manière, toutes les méthodes que tu souhaites exposer le sont, et celles que tu veux masquer sont invisibles puisque A est un membre privé de B.

  13. #13
    Membre éprouvé

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 76
    Par défaut
    Salut,

    Juste pour apporter un peu de complément à la solution de Gold Bug (qui est également la seule que je vois).


    L'inconvénient de cette solution est que tu vas devoir gérer 2 objets en parallèle : une instance de ta classe B et une instance de ta classe A (le membre privé). Donc si tu veux que ta classe B aie les mêmes propriétés publiques que ta classe A (ce qui est le cas quand tu fais des l'héritage), tu vas être obligé de
    1. Instancier un objet de la classe A dans le constructeur de ta classe B (ou transmettre à B une instance d'un objet de la classe A)
    2. déclarer manuellement dans ta classe B toutes les propriétés publiques de A et les relier à celle de l'instance de A du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public string maProp
    {
      get {return this.myA.maProp;}
      set {this.myA.maProp = value;}
    }

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    726
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 726
    Par défaut
    Citation Envoyé par phertzog Voir le message
    Salut,
    L'inconvénient de cette solution est que tu vas devoir gérer 2 objets en parallèle
    J'avais pensé à cette solution mais c'est justement ça qui m'embête.

    Mais il est vrai que, en toute logique, si un membre (propriété ou méthode) est publique dans une classe mère A alors il est obligatoirement accessible dans la classe dérivée.

  15. #15
    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
    Ce que tu peux imaginer, aussi, c'est d'utiliser une interface : tu definis une interface avec juste les methodes et les proprietes qui t'interessent ; et tu crees une classe qui herite de la classe "pourrie", tout en lui faisant implementer cette interface.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Pourrie
    {
      int ProprieteChouette { ... }
      void MethodeCool(int trucId) { ... }
      void MethodeNaze() { ... }
    }
     
    interface IBidule
    {
      int ProprieteChouette { get; set; }
      void MethodeCool(int trucId);
    }
     
    class Bidule : Pourrie, IBidule { }
    Apres, tu ne manipules dans ton code que des IBidule (sauf a l'instanciation bien sur, ou c'est des Bidule que tu crees). Ca ne masque pas completement, puisque tes IBidule seront indirectement des Pourrie, mais bon c'est deja ca.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 16/07/2009, 08h13
  2. [WPF] appeler une méthode de la classe "parente"
    Par Invité dans le forum Framework .NET
    Réponses: 3
    Dernier message: 19/10/2007, 09h44
  3. Attacher un évènement à une méthode de la classe courante
    Par hush dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/06/2007, 00h40
  4. Réponses: 6
    Dernier message: 25/04/2007, 18h07
  5. Réponses: 3
    Dernier message: 15/12/2006, 16h14

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