C# 8.0 – Specification – Default Interface Methods o Default Implementations in Interfaces
Índice general – C# 8.0 – Specification
Quizás encuentres esta nueva funcionalidad de C# 8.0 como Default Interface Methods o bien como Default Implementations in Interfaces.
Ambas tienen el mismo significado, que no es otro que el asegurar o evitar breaking changes en nuestro código cuando trabajamos con interfaces y queremos extenderlas.
Para comprender mejor cómo podemos llevar a cabo este tipo de operaciones, supongamos el siguiente ejemplo de código de una interfaz:
public interface ISample { string MyMethod(string name, DateTime registerdAt); }
Como podemos apreciar, es una interfaz sencilla.
Una posible implementación de la interfaz quedaría de la siguiente forma:
public class MySample : ISample { public string MyMethod(string name, DateTime registerdAt) => $"{name.ToUpper()} at {registerdAt}"; }
Y consumir esta interfaz y la clase que lo implementa podría quedar de esta otra forma:
ISample sample = new MySample(); Console.WriteLine(sample.MyMethod("Peter", DateTime.UtcNow));
Ahora bien, imaginemos que en un determinado momento surge una necesidad por la cuál nos vemos obligados a extender nuestra interfaz, incluyendo en ella un nuevo método.
Por ejemplo:
public interface ISample { string MyMethod(string name, DateTime registerdAt); string MyMethod(string name); }
El compilador nos indicará que hay un problema en la implementación de la interfaz, y que requiere cambios.
Imaginemos igualmente que el uso de esta interfaz está extendido en nuestra aplicación.
Comprenderemos rápidamente que las modificaciones que debemos hacer pueden ser bastante grandes, dependiendo de la envergadura y complejidad de nuestro proyecto, y que en determinadas circunstancias puede plantear un gran problema.
¿Cómo resolver el problema?.
Con Default Interface Methods o Default Implementations in Interfaces precisamente.
En C# 8.0 está permitido extender nuestra interfaz, haciendo que un método de la interfaz, llame a otro existente, evitando de esta forma los tan temidos breaking changes en nuestro código.
Así que nuestro código «compatible» y aceptado en C# 8.0, quedará de la siguiente forma:
public interface ISample { string MyMethod(string name, DateTime registerdAt); string MyMethod(string name) => MyMethod(name, DateTime.UtcNow); }
De esta manera, estaremos evitando conflictos y problemas, sin afectar al código actual de nuestra aplicación.
Se trata de una característica que tiene según que clase de proyectos, ciertas ventajas, aunque también tiene riesgos si no somos cuidadosos.
Conviene utilizarla (como todo) con sentido común.
Happy Coding!