interfaccia privata Inheritance
Storicamente, le lingue hanno permesso l'ereditarietà privata. In C++, puoi ereditare da un tipo senza essere polimorficamente compatibile con quel tipo. È solo un modo conveniente per riutilizzare un'implementazione. Nel CTS, non è possibile eseguire l'ereditarietà di implementazione privata. Ma puoi usare l'ereditarietà dell'interfaccia privata.
L'ereditarietà dell'interfaccia privata è in realtà solo un modo per nascondere i metodi dall'API pubblica di un tipo. Sono compilati in metodi privati ma sono effettivamente accessibili attraverso la mappa dell'interfaccia di un tipo. In altre parole, possono essere richiamati solo attraverso un riferimento digitato come interfaccia su cui è definito il metodo. Un esempio renderà questo più facile da capire:
class PrivateImplementer : IFoo
{
void IFoo.Foo()
{
Console.WriteLine("PrivateImplementer::IFoo.Foo");
}
}
In questo caso, PrivateImplementer
è pubblicamente noto per implementare IFoo
. Pertanto, un'istanza può essere trattata polimorficamente come un'istanza di IFoo
. Ma in realtà non puoi chiamare Foo su di esso a meno che non lo tratti come IFoo
. Questo codice illustra questo:
PrivateImplementer p = new PrivateImplementer();
p.Foo(); // This line will fail to compile
IFoo f = p;
f.Foo();
È possibile selezionare i metodi individuali di un'interfaccia per implementare privatamente. Ad esempio, se PrivateImplementer
implementato IFooBar
, potrebbe scegliere di implementare Foo in privato, ma Bar pubblicamente utilizzando la sintassi ordinaria.
In pratica, non ci sono molti casi comuni in cui si utilizza l'implementazione privata. La libreria System.Collections.Generic
utilizza questo approccio per implementare segretamente tutte le interfacce legacy System.Collections legacy. Ciò rende la compatibilità all'indietro "funziona", ad esempio passando un'istanza di List<T>
a un metodo che prevede che un IList
funzionerà correttamente. In questo esempio specifico, ingombrare le nuove API di tipo sarebbe stato un peccato (ci sono parecchi metodi necessari per l'interoperabilità debolmente tipizzata).
"No", è una risposta piuttosto scadente se cercava di scoprire quello che sapevi. Sembra uno che vuole solo mostrare quanto ne sa.
Anche se questo è vero, non sarebbe uno degli usi più inutili delle interfacce? Non riesco a capire perché mai useresti una tale costruzione. – Razzie
faticando a pensare a molto di un caso d'uso per questo, o almeno a un caso d'uso che non comporta anche la creazione di una classe di Dio – annakata
Questo è ciò che ho interpretato la domanda nel senso che, in tal caso, era solo una domanda sciocca il intervistatore chiesto! – RichardOD