派生接口中的新方法声明

vkr*_*rzv 1 .net c# com-interop

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

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

public interface IDerived : IBase
{
    new Result Process(Settings settings);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 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();
    }
}
Run Code Online (Sandbox Code Playgroud)