Necesito crear sobrecargas para funciones en una interfaz existente sin afectar a los componentes que actualmente implementan o hacen uso de la interfaz (idealmente).Agregar nuevas funciones a una interfaz
Calculo que tengo un par de opciones:
simplificado interfaz original:
public interface IServerComponent
{
bool Add(int a, int b);
}
puedo añadir las nuevas funciones sobrecargadas a la interfaz y la fuerza de cada clase que implementa la interfaz de implementar las nuevas funciones.
public interface IServerComponent
{
bool Add(int a, int b);
bool Add(int a, int b, int c);
}
O puedo crear una nueva interfaz que implemente la interfaz original. A continuación, otras clases que hacen uso de los originales no tendrán que cambiar y nuevas clases pueden implementar la nueva interfaz ...
public interface IServerComponent2 : IServerComponent
{
bool Add(int a, int b, int c);
}
¿Cuál es la mejor práctica es esta situación? ¿Hay otras opciones disponibles?
Gracias
+1 por mencionar los métodos de extensión – ram
Los métodos de extensión va a funcionar, sino que también tendrá el efecto de extender la funcionalidad de la clase que implementa a través de otras clases que reducen la cohesión. Veo esto como una solución temporal en el mejor de los casos. En el caso donde no puede extender la clase, porque no tiene acceso a la fuente, entonces los métodos de extensión tienen sentido. Podría hacerlo de esta manera para actualizaciones menores a una base de código existente, pero ciertamente lo pondría en mi lista de refactorizaciones para la próxima versión principal. – tvanfosson
Esto depende totalmente del diseño. Si agrega * nueva funcionalidad *, entonces estaría de acuerdo; pertenece a una interfaz. Si agrega * sobrecargas * (p. Ej., Funcionalidad casi idéntica, siempre expresable en términos de otras funciones), entonces no estoy de acuerdo. En este caso, los métodos de extensión permiten * ortogonalidad *, reduciendo la duplicación de código. [Joe Duffy] (http://www.bluebytesoftware.com/blog/2010/02/10/ExtensionMethodsAsDefaultInterfaceMethodImplementations.aspx) tiene una buena publicación de blog sobre el tema. –