我最近研究了一些代码并遇到了一个派生接口,它声明了new
方法,其名称和签名与基本接口完全相同:
public interface IBase
{
Result Process(Settings settings);
}
public interface IDerived : IBase
{
new Result Process(Settings settings);
}
我想知道是否有理由这样做。根据我的理解,我可以安全地删除后一个方法声明并保持IDerived
为空,而不会破坏使用它的任何代码。我错了吗?
P.S。如果这很重要,这些接口声明还具有以下属性:ComVisible(true)
,InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
和Guid(...)
。
答案 0 :(得分: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();
}
}