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
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
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.
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.
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".
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).
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.
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).
je crois que la POA (programmation orientée aspect) permettrait des choses de ce genre, mais ça devient vraiment TROP compliqué...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).
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
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 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...
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é.
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.
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
- 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)
- 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;} }
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.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.
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 { }
Partager