This question y Eric Lippert's answer me pregunto: ¿cómo do decide si utilizar una implementación explícita o implícita al implementar métodos de una interfaz?¿Debo implementar miembros de la interfaz de forma explícita o implícita?
Respuesta
(personalmente) Solo veo una necesidad de implementaciones explícitas cuando hay un conflicto entre los métodos con la misma firma.
Por ejemplo, al implementar IEnumerable<T>
, debe implementar 2 métodos GetEnumerator()
que tengan la misma firma, excepto el tipo de devolución. Por lo que tendrá que poner en práctica IEnumerable.GetEnumerator()
explícitamente:
public abstract class MyClass<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
return ...;
}
IEnumerator IEnumerable.GetEnumerator() // explicit implementation required
{
return GetEnumerator();
}
}
Otro uso para una implementación explícita es, si usted no desea que el método que se llama a través de una instancia de objeto, pero sólo a través de una interfaz. Personalmente, creo que esto no tiene mucho sentido, pero en algunos casos muy raros, puede ser útil.
La respuesta de Philippe es práctica, pero también hay consideraciones arquitectónicas.
Las interfaces se utilizan para hacer que las clases sean compatibles para que puedan ser consumidas por otros objetos. Si solo los objetos que consumen necesitan la funcionalidad de la interfaz, entonces debe restringirse de esa manera por el principio de privilegio mínimo. Si no fuera necesario exponer ese método de interfaz a todos los demás usuarios de la clase.
Paul
Otro caso para las interfaces explícitas es donde el objeto necesita implementar una interfaz para aceptar llamadas de un objeto interno, pero que no quiere exponer a los como parte de su API.
- 1. Implementación implícita y explícita de la interfaz
- 2. implícita vs implementación de interfaz explícita
- 3. ¿Debo implementar la interfaz Sec en clojure
- 4. scala conversión implícita o explícita de iterador a iterable
- 5. ¿Tiene sentido la implementación de la interfaz tanto implícita como explícita?
- 6. Vinculación implícita con explícita a una DLL
- 7. Llamada explícita vs implícita de toString
- 8. Vinculación explícita vs implícita de SQL
- 9. Inicialización explícita de los miembros struct/class
- 10. Diferencia entre la ejecución implícita y explícita de interfaces de C#
- 11. ¿Por qué una clase C# puede heredar de una interfaz de manera implícita y explícita?
- 12. "Restricciones para la implementación de interfaz explícita ..."
- 13. Implementación de interfaz explícita en VB.NET
- 14. Implementación de interfaz explícita y Reflection.Emit
- 15. ASP.NET: ¿localización explícita frente a implícita?
- 16. Carga lenta implícita frente a la carga vaga explícita
- 17. ¿Por qué implementación de interfaz explícita?
- 18. abstracta implementación de interfaz explícita en C#
- 19. aplicación explícita de una interfaz usando una propiedad automática
- 20. C Diseño # Idioma: implementación de interfaz explícita de un evento
- 21. reducir, o recursión explícita?
- 22. ¿Debo usar miembros de datos estáticos? (C++)
- 23. ¿Por qué usamos la interfaz sin miembros?
- 24. Interfaz sin miembros: ¿mala práctica?
- 25. ¿Cuándo deberíamos implementar la interfaz Serializable?
- 26. ¿.NET FtpWebRequest admite tanto implícita (FTPS) como explícita (FTPES)?
- 27. ¿Es un objeto o una interfaz? ¿Debo liberarlo o no?
- 28. ¿Cómo debo hacer esta especialización explícita?
- 29. ¿Cómo implementar la interfaz de IComparable?
- 30. ¿Debo implementar IDisposable aquí?
¿Puedes pensar en un ejemplo donde esto podría aplicarse? – jasonh
Web dev. Si una clase está diseñada para proporcionar servicios a través de la web, puede haber métodos para, por ejemplo, la verificación de identidad en una interfaz de seguridad que pueda usarse en ninguna otra circunstancia (localmente). Esta es una pequeña característica conocida de C# que creo que a menudo se ignora. Otros ejemplos por ahí? – Paul