Cacher les membres hérités
Je suis à la recherche pour certains moyen efficace pour cacher les membres hérités. J'ai une bibliothèque de classes qui héritent de communes des classes de base. Certaines des plus récentes descendant classes héritent des propriétés de dépendance qui sont devenus des vestiges et peut être un peu déroutant lors de l'utilisation de IntelliSense ou à l'aide des classes dans un concepteur visuel.
Ces classes sont tous les contrôles qui sont écrits pour être compilé pour WPF ou Silverlight 2.0. Je sais que sur ICustomTypeDescriptor
et ICustomPropertyProvider
, mais je suis pratiquement certaine que ceux qui ne peuvent pas être utilisés dans Silverlight.
Ce n'est pas comme beaucoup une fonctionnelle de la question comme un problème de convivialité. Que dois-je faire?
Mise à jour
Certaines des propriétés que je tiens vraiment à cacher venir à partir d'ancêtres qui ne sont pas de mon propre et parce que d'un outil spécifique, je suis de la conception, je ne peux pas faire membre de la cacher avec la new
de l'opérateur. (Je sais, c'est ridicule)
Vous devez vous connecter pour publier un commentaire.
Les remplacer comme Michael Suggère ci-dessus et pour empêcher les gens d'utiliser le remplacé (sp?) les méthodes, les marquer comme obsolète:
Si le deuxième paramètre est défini sur true, une erreur de compilation sera généré si quelqu'un essaie d'appeler la méthode et de la chaîne dans le premier paramètre est le message. Si parm2 est faux seulement un avertissement du compilateur sera généré.
Obselete
seulement donne un avertissement, ce qui est incorrect comme deuxième argument detrue
provoque une erreur de compilation, plutôt que l'avertissement, - le vous répondre directement commenté précise. Si je ne suis malentendu vous, je me félicite de la clarification. Voici le MSDN sourceSi vous ne pouvez pas empêcher l'utilisation de celles héritées des membres, à ma connaissance, vous devriez être en mesure de cacher de l'IntelliSense à l'aide de la EditorBrowsableAttribute:
Edit: Juste vu cela dans les commentaires de documentation, ce qui le rend un peu inutile à cet effet:
Une chose que vous pouvez faire est de contenir de l'objet plutôt que de s'étendre de l'autre classe. Cela vous donnera une plus grande souplesse en termes d'exposer ce que vous souhaitez exposer, mais si vous avez absolument besoin de l'objet de ce type, il n'est pas la solution idéale (sinon, vous pourriez vous exposer l'objet d'un getter).
Ainsi:
Devient:
Ou:
Je pense que vous êtes mieux moins hackish d'envisager la composition, par opposition à l'héritage.
Ou, vous pouvez créer une interface qui a des membres que vous voulez, demandez à votre classe dérivée de mettre en œuvre cette interface, et le programme à l'encontre de l'interface.
Je sais qu'il y a eu plusieurs réponses à cela, et il est assez vieux maintenant, mais la méthode la plus simple pour ce faire est juste de les déclarer comme
new private
.Prenons un exemple, je suis en train de travailler, où j'ai une API qui met à la disposition de chaque méthode dans une 3e partie de la DLL. Je dois prendre leurs méthodes, mais je veux utiliser un .Nets de la propriété, au lieu d'un "getThisValue" et "setThisValue" la méthode. Donc, j'ai créer une deuxième classe, héritent de la première, faire une propriété qui utilise les méthodes get et set, puis remplacer l'original méthodes get et set comme privé. Ils sont toujours disponibles à tous ceux qui veulent construire quelque chose de différent sur eux, mais si ils veulent juste utiliser le moteur je suis en train de construire, puis ils seront en mesure d'utiliser les propriétés au lieu de méthodes.
À l'aide de la double méthode de classe, se débarrasser de toutes les restrictions sur l'impossibilité d'utiliser les
new
déclaration de cacher les membres. Vous ne pouvez pas utiliseroverride
si les membres sont marqués comme virtuel.Maintenant valueEnum est disponible pour les deux classes, mais seulement la propriété est visible dans le APIUsageClass classe. Le APIClass classe est toujours disponible pour les personnes qui veulent prolonger l'origine de l'API ou de l'utiliser d'une manière différente, et la APIUsageClass est disponible pour ceux qui veulent quelque chose de plus simple.
En fin de compte, ce que je vais faire c'est de faire le APIClass interne, et seulement exposer ma classe héritée.
Pour bien cacher et de marquer à ne pas utiliser, y compris intellisense qui, je crois, est ce que la plupart des lecteurs s'attendent à ce ...
J'ai testé toutes les solutions proposées et elles ne sont pas vraiment cacher de nouveaux membres.
Mais celui-ci N':
Mais dans le code-behide il est toujours accessible, de manière à ajouter ainsi Obsolète Attribut
Vous pouvez utiliser une interface
Alors que clairement indiqué ci-dessus qu'il n'est pas possible en C# pour changer les modificateurs d'accès sur les méthodes héritées et les propriétés, j'ai surmonté ce problème à travers une sorte de "faux héritage" à l'aide de la conversion implicite.
Exemple:
Maintenant, disons que vous voulez un
class B
d'hériter declass A
, mais que vous voulez modifier certains accessibilité ou même de changer Method1 entièrementEn incluant l'implicite exprimées à la fin, il nous permet de traiter
B
objets commeA
s lorsque nous en avons besoin. Il peut également être utile de définir un cast implicite deA->B
.Le plus gros défaut de cette approche est que vous avez besoin de ré-écrire à chaque méthode/propriété que vous avez l'intention de "hériter".
Il y a probablement encore plus de défauts à cette approche, mais j'aime l'utiliser comme une sorte de "faux héritage".
Remarque:
Tout cela permet de modifier l'accessibilité de
public
propriétés, il ne résout pas le problème desprotected
propriétés publiques.