Y a-t-il une raison pour laquelle vous ne pouvez pas définir le modificateur d’access sur une méthode ou dans une interface?

La responsabilité de la visibilité d’une méthode est reléguée à la classe qui implémente l’interface.

public interface IMyInterface { bool GetMyInfo(ssortingng request); } 

En C #, définissez le modificateur d’access public, privé ou protégé avant que la méthode GetMyInfo () ne génère l’erreur suivante: Le modificateur ‘privé’ n’est pas valide pour cet élément.

Y a-t-il une raison pour laquelle vous ne pouvez pas définir le modificateur d’access sur une méthode ou dans une interface?

(Question déjà posée en français ici )

L’interface définit un contrat entre un object et des clients qui appellent ses membres. Aucun autre object ne peut accéder à une méthode privée, il est donc inutile de l’append à l’interface. Tous les membres d’une interface sont considérés comme publics pour cette raison.

Vous pouvez réellement rendre la méthode privée dans la classe d’implémentation, si vous faites une implémentation d’interface explicite:

 public interface IMyInterface { bool GetMyInfo(ssortingng request); } public class MyClass : IMyInterface { public void SomePublicMethod() { } bool IMyInterface.GetMyInfo(ssortingng request) { // implementation goes here } } 

Cette approche signifie que GetMyInfo ne fera pas partie de l’interface publique de MyClass . Vous pouvez y accéder uniquement en MyClass une instance IMyInterface en IMyInterface :

 MyClass instance = new MyClass(); // this does not comstack bool result = instance.GetMyInfo("some request"); // this works well on the other hand bool result = ((IMyInterface)instance).GetMyInfo("some request"); 

Ainsi, dans le contexte de l’interface, tous ses membres seront publics. Ils peuvent être masqués de l’interface publique d’une classe d’implémentation, mais il est toujours possible de faire un transtypage de type sur l’instance et d’accéder aux membres de cette façon.

En ce qui concerne OO – l’encapsulation consiste à cacher des données. Cela signifie que tout ce qui se passe dans une classe dépend de son implémentation. Ce qui signifie qu’il serait inutile d’appliquer de manière contractuelle des membres privés.

Cependant, la raison pour laquelle on utilise des interfaces est que vous voulez vous assurer qu’une classe adhère à un contrat spécifique et expose plusieurs membres publics de manière cohérente.

Toutes les méthodes d’une interface doivent avoir le même niveau d’access pour que l’appelant puisse toutes les utiliser. Cependant, les interfaces peuvent aussi être internes (ou en tant qu’interface privée nestede).

Si vous avez besoin de différents niveaux d’access, utilisez une interface distincte.

Une définition privée dans l’interface permettrait de:

  1. n’apporte aucun avantage à l’utilisateur de l’interface (elle est privée après tout)
  2. contraindre la classe d’implémentation à implémenter la méthode ou la propriété
  3. brouiller la nature conceptuelle de l’interface avec des détails de mise en œuvre
  4. être comme une classe abstraite avec une méthode privée (ce qui n’est pas autorisé)