es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    public interface IDBOperationResult
    {
        bool IsSuccess { get; }
        string Message { get; }
    }
    
    public interface IDatabaseItem
    {
        int Id { get; }
        DateTime Date { get; }
    
        IDBOperationResult Delete(string extraData);
    }
    

    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 de IDBOperationResult, 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:

    public class MyDatabaseItem : IDatabaseItem
    {
        // ... implementación de otros miembros
    
        public IDBOperationResult Delete(string extraData)
        {
            bool success = // realizar aquí la operación de eliminación
    
            return new DBOperationResult(success, "La eliminación del elemento " + Id + " " + (success ? "ha tenido éxito" : "ha fallado"));
        }
    
        private class DBOperationResult : IDBOperationResult
        {
            public bool IsSuccess { get; }
            public string Message { get; }
    
            public DBOperationResult(bool isSuccess, string message)
            {
                IsSuccess = isSuccess;
                Message = message;
            }
        }
    }
    

    Aquí, la clase MyDatabaseItem proporciona una implementación del método Delete que realiza la operación de eliminación real, utilizando el parámetro extraData según sea necesario. El método construye y devuelve una instancia de la clase DBOperationResult, que implementa la interfaz IDBOperationResult 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 interfaz IDBOperationResult también permite una mejor flexibilidad y extensibilidad en el futuro.

Comments are closed.