c# class inheritance interface

¿Por qué un método de interfaz C#implementado en una clase debe ser público?



class inheritance (3)

Este es un ejemplo de por qué no tiene sentido ser capaz de anular la visibilidad:

interface someI { void doYourWork(); } public class A : someI { public void doYourWork() { //... } } public class B : someI { private void doYourWork() { //... } } void Main() { List<someI> workers = getWorkers(); foreach(var worker in workers) worker.doYourWork(); }

¿Qué pasa cuando su trabajador es del tipo B? Está llamando a un método como si fuera público, pero es un método privado. Si quieres esta funcionalidad, entonces no es realmente un método privado, ¿verdad?

Si solo desea que sea público cuando se hace referencia a través de su interfaz, puede definirlo como tal:

public class B : someI { void someI.doYourWork() { //... } }

Y terminas con esto:

var b = new B(); b.doYourWork(); // Not accessible ((someI)b).doYourWork(); // Accessible

Tengo una clase que hereda una interfaz. Un método de miembro de interfaz se implementa en mi clase sin un modificador de acceso (por lo tanto, por defecto es privado).

Recibo el error "no se puede implementar un miembro de la interfaz porque no es público".

¿Por qué no está permitido? ¿No puedo anular la accesibilidad?


Los métodos deben implementarse de manera public porque deben ser invocables a través de la interfaz, por lo tanto, desde donde la interfaz es accesible como un tipo.

Tiene algunas opciones aquí para " cambiar " la visibilidad de ese método. Dado:

public interface IFoo { bool IsFoo(); }

A. Implementar el método explicitly

public class Foo : IFoo { bool IFoo.IsFoo() { return true; } }

El método solo estará disponible a través de la interfaz ( IFoo en este caso).

B. Cambiar la visibilidad de la interfaz.

Defina la interfaz como internal lugar de public . Como consecuencia, sin embargo, Foo también tendrá que ser internal .


Requerir que una implementación de interfaz sea pública es simplemente un requisito lógico. Cuando implementas una interfaz, le dices al compilador "Hey, implemento todos los métodos en esta interfaz". Por lo tanto, hacer que el método sea privado hace que ya no sea accesible, y lógicamente no implementado. Las interfaces sirven como un contrato para el código que usa su objeto y dice que siempre puede llamar a cualquier método definido en la interfaz en mi objeto. Si el método de implementación fuera privado, eso ya no sería cierto.

Si desea ocultar su implementación de, digamos Intellisense, entonces simplemente puede implementar el método explícitamente como lo menciona @Bryan.