nueva declaración de método en la interfaz derivada

Recientemente estudié algo de código y encontré una interfaz derivada que declara new método con exactamente el mismo nombre y firma que una interfaz base:

public interface IBase
{
    Result Process(Settings settings);
}

public interface IDerived : IBase
{
    new Result Process(Settings settings);
}

Me pregunto si podría haber una razón para esto. Según tengo entendido, puedo eliminar de forma segura la declaración del último método y dejar IDerived vacío sin posiblemente romper ningún código usándolo. ¿Me equivoco?

PS Si esto importa, estas declaraciones de interfaz también tienen los siguientes atributos: ComVisible(true), InterfaceType(ComInterfaceType.InterfaceIsIUnknown) y Guid(...).

preguntado el 09 de marzo de 13 a las 14:03

1 Respuestas

Bien tu puede ser capaz de deshacerse de él, pero si se deshace del método en IDerived, en realidad no es lo mismo, estrictamente hablando. En realidad, una implementación puede proporcionar dos métodos diferentes para implementar los dos métodos de interfaz de manera diferente.

Por ejemplo:

using System;

public interface IBase
{
    void Process();
}

public interface IDerived : IBase
{
    new void Process();
}

public class FunkyImpl : IDerived
{
    void IBase.Process()
    {
        Console.WriteLine("IBase.Process");
    }

    void IDerived.Process()
    {
        Console.WriteLine("IDerived.Process");
    }
}

class Test
{
    static void Main()
    {
        var funky = new FunkyImpl();
        IBase b = funky;
        IDerived d = funky;
        b.Process();
        d.Process();
    }
}

respondido 09 mar '13, 14:03

Gracias, Jon. Así que ajustaré un poco mi pregunta: si elimino el método IDerived.Process y todo el código que lo usa se compilará, ¿existe la posibilidad teórica de introducir algunos errores de tiempo de ejecución en el código? - txt

@user835103: si todo el código aún se compila (todo el código que implementa y usa las interfaces), entonces debería estar bien. - jon skeet

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.