Pourquoi faut-il un C# la méthode de l'interface implémentée dans une classe publique?
J'ai une classe qui hérite d'une interface. Une interface membre de la méthode est mise en oeuvre dans ma classe sans un modificateur d'accès (donc, par défaut c'est le privé ) .
Je reçois le message d'erreur "impossible de mettre en œuvre une interface membre parce qu'il n'est pas public".
Pourquoi il n'est pas permis? Je ne peux pas remplacer l'accessibilité?
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de pourquoi il ne fait pas de sens pour être en mesure de remplacer la visibilité:
Ce qui se passe quand votre travailleur est de type B? Vous êtes à l'appel d'une méthode, comme si elle était publique, mais c'est une méthode privée. Si vous souhaitez cette fonctionnalité, il n'est pas vraiment une méthode privée est-il?
Si vous ne voulez qu'il soit public lorsqu'elle est référencée par le biais de votre interface, vous pouvez le définir en tant que tel:
Et de vous retrouver avec ceci:
Otherwise, if a derived class re-implements an interface there will be no way to call the parent implementation
? Pourquoi voulez-vous d'avoir un protégé de la méthode de la mise en œuvre d'une interface (vous ne serez pas en mesure d'y accéder par le biais de l'interface dans ce cas, uniquement dans les classes dérivées qui ne savent même pas quelles sont les interfaces ils mettent en œuvre)Protected Overridable Sub DoSomethingImpl() Implements IDoSomething.DoSomething
; à l'extérieur de code ne sera en mesure d'appeler cette méthode par le biais de l'interface, mais une classe dérivée sera en mesure de remplacer la méthode, et dans le remplacement, appelez la méthode parent. En C#, il serait utile de pouvoir également utiliser une méthode protégée pour implémenter une interface, mais les personnes en charge de la spécification ne permet pas cette option. Le plus proche que l'on peut venir serait d'implémenter explicitement l'interface avec une méthode qui permettrait d'appel de méthode protégéeDoSomethingImpl()
. Notez que...DoSomething()
plutôt queDoSomethingImpl()
, mais en utilisant l'ancien nom d'empêcher une classe dérivée à partir de l'exposer à un publicDoSomething()
méthode.Les méthodes de mise en œuvre
public
parce qu'ils doivent être appelées à l'aide de l'interface, donc à partir de là où l'interface est accessible comme un type.Vous avez quelques options ici pour "changement" la visibilité de la méthode. Donnée:
A. mettre en Œuvre la méthode explicitement
La méthode ne sera disponible que par le biais de l'interface (
IFoo
dans ce cas.)B. Modifier la visibilité de l'interface
Définir l'interface comme
internal
au lieu depublic
. En conséquence, cependant,Foo
devra êtreinternal
trop.Nécessitant qu'une implémentation de l'interface publique est simplement une exigence logique. Lors de l'implémentation d'une interface, vous avez dit le compilateur "Hey j'en œuvre de chaque méthode sur cette interface". Afin de faire de la méthode privée, il n'est plus accessible - et logiquement pas mis en œuvre. Les Interfaces de servir comme un contrat à un code qui utilise votre objet en disant: vous pouvez toujours faire appel à toutes les méthodes définies dans l'interface de mon objet. Si la mise en œuvre de la méthode ont été privés, qui ne serait plus vrai.
Si vous souhaitez masquer votre mise en œuvre de l'Intellisense, alors vous pouvez simplement mettre en place la méthode explicitement comme @Bryan mentionne.