1

我刚刚反编译了一些 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无论如何,这都是可能的。

4

2 回答 2

1

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

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

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

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

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

于 2019-12-02T08:53:33.907 回答
0

IFoo 和 IBar 中的 Name 字段不同,可以在一个类中实现两个 Name:

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

public class Implementation : IBar
{
    string IBar.Name { get; set; } = "Bar";

    string IFoo.Name { get; set; } = "Foo";
}

如果将 Implementation 类转换为 IBar,则值为 Bar,如果将其转换为 IFoo,则值为 Foo。

于 2019-12-02T08:54:13.480 回答