为啥继承具有名称签名的接口成员的 C# 抽象类至少需要实现其中一个?

Posted

技术标签:

【中文标题】为啥继承具有名称签名的接口成员的 C# 抽象类至少需要实现其中一个?【英文标题】:why are C# abstract classes that inherit interface members with the name signature required to implement at least one of them?为什么继承具有名称签名的接口成员的 C# 抽象类至少需要实现其中一个? 【发布时间】:2013-12-09 22:53:24 【问题描述】:

如果抽象类实现了声明具有相同签名的成员的接口,则抽象类可以实现这两个成员或将其中一个成员声明为抽象并实现另一个。

无论出于何种原因,C# 抽象类(与 Java 抽象类不同)都不能“忽略”继承的接口成员。但是为什么他们不能只声明其中一个是抽象的,然后让具体的派生类型来处理这两个成员的实现呢?

如果由于某些语言限制,这太难看或不可能,那么就像继承具有相同签名的接口成员的具体类必须显式实现其中至少一个一样,为什么抽象类不能显式声明继承的接口之一成员摘要?是不是同一个原因?

【问题讨论】:

你有没有尝试过或者你在猜测?您所要求的在 C# 中始终是可能的。 也许.net 男孩认为,当其中一个成员是抽象的时,接口并没有完全实现。似乎是一个合理的观点...... 【参考方案1】:

这很好用:

interface IFoo

  void Foo();


abstract class FooBase : IFoo

  public abstract void Foo();

重新阅读问题后,我意识到我们正在谈论继承多个接口。我不确定这种情况,但说真的,你到底为什么要使用两个具有相同名称成员的接口。呸。

【讨论】:

IEnumerable<T>IEnumerator<T> 可能是 .NET 中实现最多的两个接口,它们的继承意味着所有实现都实现了两个同名的接口。当然,在这些情况下,应该如何链接它们尤其明显,但有时人们无法选择接口成员的名称,因为是其他人编写的。【参考方案2】:

如果一个类继承了两个具有同名成员的接口,但不能对两者使用相同的实现,它通常应该使用方法显式地实现成员,这些方法除了链接到可能是虚拟或抽象的受保护方法之外什么都不做。派生类实现一个也由基类实现的接口通常是一件坏事。一般而言,可继承类最好使用虚函数或抽象函数来实现接口,这样派生类就可以覆盖那些,而不必接触接口。

【讨论】:

以上是关于为啥继承具有名称签名的接口成员的 C# 抽象类至少需要实现其中一个?的主要内容,如果未能解决你的问题,请参考以下文章

抽象类中的私有非抽象成员和继承 C#

第三章:继承/抽象类/接口

解析在C#中接口和类的异同

Java学习笔记二()

接口和抽象类的区别

C#图解教程 第十五章 接口