Parámetro de delegado en método de interfaz.
Me disculpo de antemano porque siento que explicaré lo que quiero hacer de una manera realmente mala.
Tengo varios modelos en mi aplicación, cada uno de ellos implementa una interfaz llamada “IDatabaseItem”. Deseo que cada “IDatabaseItem” tenga un método de eliminación que devuelva true o false, pero también quiero que el método reciba un delegado(string) para que cuando se ejecute el método de eliminación, también pueda devolver un resultado en forma de cadena que indique si la operación fue exitosa o no. Esto también permitirá al llamador manejar el resultado de la forma que elija. En mi aplicación, esto podría ser algo como un pop-up en la interfaz de usuario.
Aquí está cómo pensé en implementar algo así:
public interface IDatabaseItem
{
int Id { get; }
DateTime Date { get; }
delegate void DBOperationResult(string result);
bool Delete(DBOperationResult foo);
}
Obtengo un resultado del compilador al intentar lo anterior:
Error CS8370 La funcionalidad 'implementación por defecto de interfaz' no está disponible en C# 7.3. Utilice la versión de lenguaje 8.0 o superior.
Según la lectura de otros mensajes, creo que podría estar equivocado y que los delegados e interfaces no se mezclan. Pero cualquier ayuda sería apreciada.
davy.ai
Como modelo de lenguaje de IA, puedo afirmar que los delegados e interfaces se pueden combinar, pero existen otras formas de lograr la funcionalidad deseada sin depender de la implementación de la interfaz por defecto. Una solución posible es definir una interfaz separada para el resultado de la operación y hacer que el método Delete devuelva una instancia de esa interfaz. Aquí tienes un ejemplo:
En este enfoque, el método
Delete
recibe un parámetro adicional de datos que se puede utilizar según sea necesario por la implementación. El método devuelve una instancia deIDBOperationResult
, que contiene un indicador (IsSuccess
) para indicar si la operación fue exitosa o fallida, y una cadena de mensaje (Message
) para proporcionar más detalles sobre el resultado de la operación. Luego, el llamador puede inspeccionar el valor devuelto para determinar si la operación fue exitosa y obtener cualquier información adicional según sea necesario.Aquí tienes un ejemplo de implementación de la interfaz
IDatabaseItem
:Aquí, la clase
MyDatabaseItem
proporciona una implementación del métodoDelete
que realiza la operación de eliminación real, utilizando el parámetroextraData
según sea necesario. El método construye y devuelve una instancia de la claseDBOperationResult
, que implementa la interfazIDBOperationResult
y encapsula el resultado de la operación.Con este enfoque, el llamador puede optar por mostrar el mensaje al usuario, registrarlo con fines de depuración o simplemente ignorarlo si no es necesario. La separación de responsabilidades entre la interfaz
IDatabaseItem
y la interfazIDBOperationResult
también permite una mejor flexibilidad y extensibilidad en el futuro.