1

我最近研究了一些代码,遇到了一个派生接口,它声明new了与基本接口完全相同的名称和签名的方法:

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

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

我想知道这是否有原因。根据我的理解,我可以安全地删除后一个方法声明并IDerived留空,而不会破坏任何使用它的代码。我错了吗?

PS 如果这很重要,这些接口声明还具有以下属性ComVisible(true)InterfaceType(ComInterfaceType.InterfaceIsIUnknown)Guid(...)

4

1 回答 1

5

好吧,您也许可以摆脱它 - 但如果您摆脱 中的方法IDerived,严格来说,它实际上并不相同。一个实现实际上可以提供两种不同的方法来不同地实现这两种接口方法。

例如:

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();
    }
}
于 2013-03-09T14:47:16.160 回答