This question e Eric Lippert's answer mi chiedo: come do si decide se utilizzare un'implementazione esplicita o implicita quando si implementano i metodi di un'interfaccia?Devo implementare i membri dell'interfaccia in modo esplicito o implicito?
risposta
(personalmente) Vedo solo la necessità di implementazioni esplicite quando c'è uno scontro tra metodi con la stessa firma.
Ad esempio, quando si implementa IEnumerable<T>
, è necessario implementare 2 metodi GetEnumerator()
che hanno la stessa firma, ad eccezione del tipo restituito. Quindi si dovrà implementare IEnumerable.GetEnumerator()
esplicitamente:
public abstract class MyClass<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
return ...;
}
IEnumerator IEnumerable.GetEnumerator() // explicit implementation required
{
return GetEnumerator();
}
}
Un altro uso per un'implementazione esplicita è che se non si desidera che il metodo da chiamare attraverso un'istanza di un oggetto, ma solo attraverso un'interfaccia. Personalmente ritengo che questo non abbia molto senso, ma in alcuni casi molto rari, può essere utile.
La risposta di Philippe è una soluzione pratica, tuttavia esistono anche considerazioni di architettura.
Le interfacce vengono utilizzate per rendere le classi compatibili in modo che possano essere utilizzate da altri oggetti. Se solo gli utenti che consumano gli oggetti hanno bisogno della funzionalità dell'interfaccia, allora dovrebbe essere limitato in questo modo dal principio del minimo privilegio. Se non fosse necessario esporre tale metodo di interfaccia a tutti gli altri utenti della classe.
Paul
Un altro caso per le interfacce esplicite è dove l'oggetto deve implementare un'interfaccia per accettare le chiamate da un oggetto interno, ma non si vuole esporre quelli come parte della vostra API.
- 1. Schema del deposito, salvataggio esplicito o implicito?
- 2. c esplicito e implicito #
- 3. Perché implementare l'interfaccia in modo esplicito?
- 4. Implementare tutti i membri dell'interfaccia
- 5. Perché dovrei usare un operatore implicito/esplicito?
- 6. Perché devo effettuare una chiamata generica in modo esplicito?
- 7. Variabili costruite in modo implicito in C++
- 8. Ritorno da un metodo con "altro" implicito o esplicito o con una singola istruzione "return"?
- 9. Caricamento pigro implicito rispetto a caricamento pigro esplicito
- 10. Quando devo implementare IDisposable?
- 11. Collegamento esplicito o esplicito a una DLL
- 12. Devo implementare onRetainNonConfigurationInstance?
- 13. Quando devo implementare __call__
- 14. Devo usare "this" per chiamare proprietà, membri o metodi della classe?
- 15. Devo implementare l'interfaccia Seq in clojure
- 16. Come devo implementare sottocomandi "nidificati" in Python?
- 17. costruttore mossa in modo esplicito in default
- 18. Devo implementare l'autenticazione OpenID? Utenti americani/giapponesi
- 19. Codice errore: 1422. Il commit esplicito o implicito non è consentito nella funzione o nel trigger memorizzato
- 20. Come devo implementare i valori associati predefiniti con Swift Enums?
- 21. Come devo implementare un tavolo Cayley in Haskell?
- 22. Sollevamento implicito in scala
- 23. Devo usare la forcella o i fili?
- 24. Devo implementare Applicative e Functor per implementare una Monad
- 25. Come devo implementare OAuth per un'applicazione?
- 26. costruttore di copia implicito
- 27. Devo usare NSUserDefaults o un plist per memorizzare i dati?
- 28. Bit implicito con costante 1 o 0 in SQL Server
- 29. Devo implementare il metodo Stop in un servizio Windows?
- 30. Come devo implementare l'appartenenza utente nel mio sito ASP.NET MVC?
Riesci a pensare a un esempio in cui questo potrebbe essere applicato? – jasonh
Web dev. Se una classe è progettata per fornire servizi attraverso il web, ci possono essere metodi per dire la verifica dell'identità in un'interfaccia di sicurezza che può essere utilizzata in nessun'altra circostanza (localmente). Questa è una caratteristica C# poco conosciuta che penso sia spesso ignorata. Altri esempi là fuori? – Paul