usar una que programacion porque mvc interfaz interfaces implementacion herencia definicion atributos c# .net interface

c# - una - Implementación de la interfaz interna



porque usar interfaces c# (2)

No hay forma de restringir las operaciones de conversión a una interfaz. Sin embargo, puede proporcionar una clase contenedora que implemente la interfaz pero que normalmente no está disponible.

Por ejemplo:

public class Foo { private IFoo wrap = new WrapFoo(this); internal IFoo GetIFoo() { return wrap; } private class WrapFoo : IFoo { public WrapFoo(Foo parent) { //Save parent } public void DoSomething() { //Implement interface } } }

Otra forma más complicada sería usar la firma de código para verificar que la persona que llama es la biblioteca y, de lo contrario, lanzar una excepción.

Directo al problema: tengo una clase que implementa dos interfaces:

public class A : Interface1, Interface2{ // Interface 1 implementation... // Interface 2 implementation... }

¿Hay alguna manera (sin crear otra clase nueva) de hacer que la implementación de Interface1 sea interna y ocultarla de otros componentes (solo Interface2 seguirá siendo pública)?

EDITAR: Algunas informaciones más útiles: Interface1 e Interface2 se definen como públicas en otro componente central y no se pueden cambiar.

Gracias por adelantado,


Si bien puede hacer que la propia interfaz sea interna, los métodos seguirían siendo parte de la API pública. Lo que puede elegir hacer es implementar la interfaz explícita, de modo que la API definida por la interfaz solo sea visible a través de la interfaz, y no a través de la clase.

interface IFoo { void M(); } interface IBar { void X(); } public class Bar : IBar, IFoo { public void X() // part of the public API of Bar { } void IFoo.M() // explicit implementation, only visible via IFoo { } } Bar bar = new Bar(); bar.X(); // visible bar.M(); // NOT visible, cannot be invoked IFoo foo = bar; foo.M(); // visible, can be invoked

Más allá de esto, si necesita que el mundo nunca tenga una idea de que la clase es compatible con la interfaz, entonces simplemente necesitará que la clase no la implemente. Las interfaces tienen la intención de transmitir que un objeto dado admite comportamientos dados, explícitamente o de otra manera. Si eso no es lo que quieres, debes ir en una dirección diferente. Simplemente podría ser que la clase implemente los comportamientos como detalles de implementación privada, sin interfaz. Otro enfoque es trasladar esas implementaciones a una clase anidada privada.

public class Bar : IBar { Foo foo = new Foo(); public void X() { } public void DoSomething() { this.foo.M(); // invokes method of instance of nested class } class Foo : IFoo { public void M() { } } }

Bajo este enfoque, el mundo nunca sabe que una clase cumple con el contrato de interfaz, porque técnicamente no lo hace. El contrato es cumplido por Foo , y el mundo no puede ver a Foo . Sin embargo, el beneficio es que si la clase necesita invocar métodos definidos externamente que requieren la interfaz, aún puede pasar la instancia de la clase anidada a esos métodos.