¿Hay alguna razón por la que no puede definir el modificador de acceso en un método o en una interfaz?

StackOverflow https://stackoverflow.com/questions/1652123

  •  22-07-2019
  •  | 
  •  

Pregunta

La responsabilidad de la visibilidad de un método se relega a la clase que implementa la interfaz.

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

En C # establece el modificador de acceso público, privado o protegido antes de que el método GetMyInfo () genere el siguiente error: El modificador 'privado' no es válido para este elemento.

¿Hay alguna razón por la que no puede definir el modificador de acceso en un método o en una interfaz?

(Pregunta ya hecha en francés aquí )

¿Fue útil?

Solución

La interfaz define un contrato entre un objeto y clientes que llaman a sus miembros. Ningún otro objeto puede acceder a un método privado, por lo que no tiene sentido agregarlo a la interfaz. Todos los miembros de una interfaz se consideran públicos por este motivo.

Otros consejos

Usted puede realmente hacer que el método sea privado en la clase de implementación, si realiza una implementación de interfaz explícita:

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

public class MyClass : IMyInterface
{
    public void SomePublicMethod() { }

    bool IMyInterface.GetMyInfo(string request)
    {
        // implementation goes here
    }
}

Este enfoque significa que GetMyInfo no formará parte de la interfaz pública de MyClass . Solo se puede acceder enviando una instancia de MyClass a IMyInterface :

MyClass instance = new MyClass();

// this does not compile
bool result = instance.GetMyInfo("some request"); 

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

Entonces, en el contexto de la interfaz, todos sus miembros serán públicos. Se pueden ocultar de la interfaz pública de una clase implementadora, pero siempre existe la posibilidad de hacer un tipo de conversión a la instancia y acceder a los miembros de esa manera.

En términos de OO, la encapsulación se trata de ocultar datos. Eso significa que todo lo que sucede dentro de una clase depende de la implementación de la clase. Lo que significa que sería inútil hacer cumplir contractualmente a miembros privados.

Sin embargo, la razón por la que uno usa interfaces es porque desea asegurarse de que una clase se adhiera a un contrato específico y exponga a varios miembros públicos de manera coherente.

Todos los métodos de una interfaz deben tener el mismo nivel de acceso, para que la persona que llama pueda usarlos todos. Sin embargo, las interfaces también pueden ser internas (o como una interfaz anidada privada).

Si necesita diferentes niveles de acceso, use una interfaz distinta.

Una definición privada en la interfaz:

  1. no proporciona ningún beneficio al usuario de la interfaz (es privado después de todo)
  2. obligar a la clase implementadora a implementar el método o propiedad
  3. enturbia la naturaleza conceptual de la interfaz con detalles de implementación
  4. ser como una clase abstracta con un método privado (que no está permitido)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top