herencia de interfaces privada
Históricamente, las lenguas 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 la 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 hará esto más fácil de entender:
class PrivateImplementer : IFoo
{
void IFoo.Foo()
{
Console.WriteLine("PrivateImplementer::IFoo.Foo");
}
}
En este caso, PrivateImplementer
se sabe públicamente a aplicar 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
, puede optar por implementar Foo de forma privada, pero Bar utiliza 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 "simplemente 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ía. Parece alguien que solo quiere mostrar cuánto saben.
Aunque eso es cierto, ¿no sería ese uno de los usos más inútiles de las interfaces? No puedo entender por qué alguna vez usarías tal construcción. – Razzie
esforzándose por pensar en un caso de uso para eso, o al menos en un caso de uso que no implique también crear una clase divina – annakata
Eso es lo que interpreté como una pregunta, en cuyo caso fue solo una pregunta tonta entrevistador preguntado! – RichardOD