首页 > 解决方案 > 在派生接口中隐藏接口成员

问题描述

我刚刚反编译了一些 3rd-party 界面,并对以下内容摸不着头脑:

public interface IFoo 
{
    string Name { get; set; }
}
public interface IBar : IFoo
{
    new string Name { get; set; }
}

正如你所看到的,我有两个接口,通过隐藏它的-property来IBar扩展。但是我看不到-keyword 在这里做什么。我阅读了 Eric Lippert 的回答,该回答与返回类型仅不同的成员有关。但是在我的情况下,一切都只是一个字符串。IFooNamenew

当然,我们可以显式地实现任何一个接口。但new无论如何,这都是可能的。

标签: c#interfacemember-hiding

解决方案


接口没有继承或覆盖某些东西的想法。您在这里使用“新”避免的只是名称冲突。您实现了一个新的属性,顺便说一下同名。其他一切都会照常工作。

在类上实现 IBar 时,您可以定义一个公共属性,这将用作两个 Name 属性。隐式定义接口的算法是从接口的角度工作的。C# 编译器为 IFoo 搜索属性名称“Name”,然后再次搜索 IBar,突然发现两者的属性相同。

或者,您可以显式声明接口成员,如果您愿意,可以附加两个不同的“名称”实现。

这也解释了为什么你总是必须用它的定义类型来命名显式定义。您必须明确实现 IFoo.Name 和 IBar.Name,它不会以任何方式隐藏,它可以从外部访问,具体取决于您使用的 Cast 到什么接口。就像您在两个不同的名称空间中定义一个类“名称”一样,这里的想法相同。

您不太可能在 VB.Net 中提出这个问题,因为那里的每个接口实现都是显式的。


推荐阅读