c# - 在派生接口中隐藏接口成员
问题描述
我刚刚反编译了一些 3rd-party 界面,并对以下内容摸不着头脑:
public interface IFoo
{
string Name { get; set; }
}
public interface IBar : IFoo
{
new string Name { get; set; }
}
正如你所看到的,我有两个接口,通过隐藏它的-property来IBar
扩展。但是我看不到-keyword 在这里做什么。我阅读了 Eric Lippert 的回答,该回答与返回类型仅不同的成员有关。但是在我的情况下,一切都只是一个字符串。IFoo
Name
new
当然,我们可以显式地实现任何一个接口。但new
无论如何,这都是可能的。
解决方案
接口没有继承或覆盖某些东西的想法。您在这里使用“新”避免的只是名称冲突。您实现了一个新的属性,顺便说一下同名。其他一切都会照常工作。
在类上实现 IBar 时,您可以定义一个公共属性,这将用作两个 Name 属性。隐式定义接口的算法是从接口的角度工作的。C# 编译器为 IFoo 搜索属性名称“Name”,然后再次搜索 IBar,突然发现两者的属性相同。
或者,您可以显式声明接口成员,如果您愿意,可以附加两个不同的“名称”实现。
这也解释了为什么你总是必须用它的定义类型来命名显式定义。您必须明确实现 IFoo.Name 和 IBar.Name,它不会以任何方式隐藏,它可以从外部访问,具体取决于您使用的 Cast 到什么接口。就像您在两个不同的名称空间中定义一个类“名称”一样,这里的想法相同。
您不太可能在 VB.Net 中提出这个问题,因为那里的每个接口实现都是显式的。
推荐阅读
- linux - 如何在 Azure linux Web 应用上托管 Angular
- node.js - 为什么 jsonwebtoken 会抛出“无效签名”错误?
- python-3.x - 我正在尝试从我的系统导入文件,但每次都显示路径目录错误
- java - Teamcity 代理在构建后断开连接(无法访问代理)
- c# - 在角度应用程序中使用 SignalR Core 时出现 CORS 错误
- reactjs - 无法更新未安装组件的状态/ useEffect 最终返回 null
- angular - 如何通过重新输入原始值使 Angular 表单字段“干净”?
- office-js - 为什么值 any[][]
- javascript - 如何在不更改时间的情况下将日期时间与时区连接起来
- dm-script - 如何在 GMS3 中创建滑块