usan una que programacion mvc las interfaz interfaces ejemplos declaracion como clase caracteristicas atributos abstracta c#

una - interfaces en c# ejemplos



¿Qué es una interfaz privada? (5)

Al igual que una clase interna (que también es privada), puede utilizar una interfaz privada en una clase existente.

En una entrevista hace un tiempo para un puesto de .NET, el entrevistador me preguntó "¿para qué usarías una interfaz privada?".

Le pregunté si se refería a la diferencia entre la implementación implícita frente a la interfaz explícita a la que respondió que no.

Entonces me pregunto:

  1. ¿A qué se refería?
  2. ¿Para qué usarías una interfaz privada?

Busqué en Google un poco y encontré this artículo explicando cómo las interfaces privadas se pueden usar para proporcionar diferentes interfaces a diferentes clientes. Esta es la historia de C ++.

No creo que esto se pueda aplicar a C #, porque el mismo efecto de IMO se puede lograr con interfaces explícitas y clientes que emiten el host a la interfaz adecuada.

Tal vez alguien más puede ver algo que extrañé allí ...

También encontré esto en MSDN :

Los métodos de interfaz tienen acceso público, que no puede ser modificado por el tipo de implementación. Una interfaz interna crea un contrato que no debe implementarse fuera del ensamblado que define la interfaz. Un tipo público que implementa un método de una interfaz interna que utiliza el modificador virtual permite que el método sea anulado por un tipo derivado que está fuera del ensamblaje. Si un segundo tipo en el ensamblado de definición llama al método y espera un contrato solo interno, el comportamiento puede verse comprometido cuando, en cambio, se ejecuta el método reemplazado en el ensamblaje externo. Esto crea una vulnerabilidad de seguridad.


De este enlace

Herencia de interfaz privada

Históricamente, los idiomas han permitido la herencia privada. En C ++, puede heredar de un tipo sin ser polimórficamente compatible con ese tipo. Es solo una forma conveniente de reutilizar una implementación. En el CTS, no puede hacer la herencia de implementación privada. Pero puedes usar herencia de interfaz privada.

La herencia de interfaz privada es realmente solo una forma de ocultar métodos de una API pública de un tipo. Se compilan en métodos privados, pero en realidad son accesibles a través del mapa de interfaz de un tipo. En otras palabras, solo se pueden llamar a través de una referencia escrita como la interfaz en la que se define el método. Un ejemplo lo hará más fácil de entender:

class PrivateImplementer : IFoo { void IFoo.Foo() { Console.WriteLine("PrivateImplementer::IFoo.Foo"); } }

En este caso, se conoce públicamente que IFoo implementa IFoo . Por lo tanto, una instancia puede tratarse polimórficamente como una instancia de IFoo . Pero no puedes llamar a Foo, a menos que lo trates como IFoo . Este código demuestra esto:

PrivateImplementer p = new PrivateImplementer(); p.Foo(); // This line will fail to compile IFoo f = p; f.Foo();

Puede seleccionar métodos individuales de una interfaz para implementar de forma privada. Por ejemplo, si PrivateImplementer implementó IFooBar , podría optar por implementar Foo de manera privada, pero Bar IFooBar públicamente la sintaxis ordinaria.

En la práctica, no hay muchos casos comunes en los que utilizaría la implementación privada. La biblioteca System.Collections.Generic utiliza este enfoque para implementar en secreto todas las interfaces heredadas System.Collections heredadas. Esto hace que la compatibilidad con versiones anteriores "solo funcione", por ejemplo, pasar una instancia de List<T> a un método que espera que un IList funcione bien. En este ejemplo específico, abarrotar las nuevas API de tipo habría sido una pena (hay bastantes métodos necesarios para la interoperabilidad de tipo débil).

"No" es una respuesta bastante pobre si estaba buscando averiguar lo que sabías. Parece alguien que solo quiere mostrar cuánto saben.


ShuggyCoUk da una buena respuesta pero con tal comentario

Este es un caso potencialmente útil, pero no es algo que desearía usar con mucha frecuencia. Ciertamente, su uso en una entrevista parece un caso límite que el entrevistador está usando porque lo han visto y aunque fue "interesante"

Yo, debo decir, definitivamente no es capacidad solo para entrevistadores inteligentes.

Aquí está la Realización de Full State Machine (FSM) con herencia y soporte unitario , que es un buen ejemplo del uso de interfaces privadas / protegidas.

Fue una respuesta a preguntas ¿Cuál es el equivalente de C # de un amigo? y ¿Por qué C # no proporciona la palabra clave ''amigo'' de estilo C ++? y, de hecho, en tu pregunta también.


Una interfaz puede ser privada dentro de otra clase

public class MyClass { private interface IFoo { int MyProp { get; } } private class Foo : IFoo { public int MyProp { get; set; } } public static void Main(string[] args) { IFoo foo = new Foo(); return foo.MyProp; } }

en términos de utilidad, simplemente se esconde de otro código, incluso dentro del mismo conjunto, que dicha interfaz existe. La utilidad de esto no es terriblemente alta en mi opinión.

La implementación explícita de la interfaz es una cuestión diferente, tiene algunos casos muy útiles (especialmente cuando se trabaja con genéricos e interfaces no genéricas más antiguas), pero yo no lo llamaría ''interfaces privadas'' y no diría que el término se usa comúnmente de esa manera.

Usando las dos técnicas juntas, puedes hacer:

public class MyClass { private interface IFoo { int MyProp { get; } } public class Foo : IFoo { int IFoo.MyProp { get; set; } } public static void Main(string[] args) { IFoo foo = new Foo(); return foo.MyProp; } } public class HiddenFromMe { public static void Main(string[] args) { MyClass.Foo foo = new MyClass.Foo(); return foo.MyProp; // fails to compile } }

Esto le permite exponer las clases anidadas de alguna manera mientras permite que la clase padre invoque métodos que el mundo exterior no puede. Este es un caso potencialmente útil, pero no es algo que desearía usar con mucha frecuencia. Ciertamente, su uso en una entrevista parece un caso límite que el entrevistador está usando porque lo han visto y aunque fue "interesante"