Question

Bonjour, j'ai la classe "A". avec comme méthode abstraite

protected abstract List<Contributor> GetContributors(List<SyndicationPerson> contributersList);

Je souhaite remplacer cette méthode dans la classe dérivée "B". avec les conditions suivantes

  • Il devrait être privé de la classe B.
Le compilateur

ne me permet pas de déclarer cette méthode privée dans la classe dérivée "B". quelle est la syntaxe correcte?

Était-ce utile?

La solution

Vous ne pouvez pas. Cela violerait le niveau d'accessibilité déclaré en classe A. En plus de toute autre chose, cela l'empêcherait d'être appelé par la classe A! Que penseriez-vous si le code de classe A essayait d'appeler la méthode abstraite que vous auriez remplacée par une implémentation privée?

Vous pouvez rendre l’implémentation principale privée, puis créer une méthode protégée qui n’appelle que la méthode privée, si vous le souhaitez vraiment.

Pourquoi voulez-vous que la méthode soit privée en premier lieu, alors qu'elle est conçue pour pouvoir être appelée depuis A?

EDIT: Bon, maintenant que vous avez expliqué dans votre commentaire ce que vous voulez faire, vous ne pouvez pas le faire. Le plus proche est de passer un délégué au constructeur de A - ce délégué peut faire référence à une méthode privée. Malheureusement, vous ne pouvez pas utiliser " this " lorsque vous transmettez des arguments dans des chaînes de constructeurs, vous êtes donc obligé de faire quelque chose d'horrible, comme écrire une méthode statique qui utilise "this" En tant que premier paramètre, effectivement ... sauf qu'il devra le transtyper dans le bon type également, car le parent ne peut pas déclarer quel type il devrait être. Le parent appelle alors le délégué au lieu de la méthode protégée.

Notez que cela empêcherait également les autres classes dérivées de "surcharger". en outre, ce qui peut être souhaitable ou non.

C'est incroyablement tortueux, et j'essayerais de l'éviter autant que possible. Si vous vous inquiétez vraiment de ce que pourraient faire les classes dérivées, j'essaierais plutôt de sceller la classe et d'obliger les gens à utiliser la composition plutôt que l'héritage. La langue ne vous aide pas vraiment à faire ce que vous voulez ici.

Autres conseils

En règle générale, il est impossible de réduire la visibilité d'un membre lors d'une substitution. Il est donc interdit de passer de protégé à privé.

Vous ne pouvez pas modifier le niveau d'accès des méthodes virtuelles en C #. Vous pouvez le redéclarer à l'aide du mot clé new , mais il s'agit d'une redéclaration qui masque la méthode précédente. Elle ne fonctionnera donc pas comme prévu si vous traitez avec des objets de types déclaré et réel différents. ou si vous convertissez régulièrement des objets en un type de classe de base.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top