C # : 抽象类需要实现接口?

我在 C # 中的测试代码:

namespace DSnA
{
public abstract class Test : IComparable
{


}
}

导致下列编译器错误:

error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'

既然类 Test抽象类,为什么编译器要求它实现接口?这个需求不应该只是针对具体类的 强制性的吗?

78977 次浏览

在 C # 中,实现接口的类是 需要,用于定义该接口的所有成员。对于抽象类,只需使用 abstract关键字定义这些成员:

interface IFoo
{
void Bar();
}


abstract class Foo : IFoo
{
public abstract void Bar();
}

或者换句话说: 你的 不要必须 “执行”它(这将是一个可怕的限制,对抽象类) ; 然而,在 C # ,你的 必须告诉编译器,你是故意把责任传递给具体的子类-和上面的代码行显示如何做到这一点。

那些抱怨这不是问题答案的评论和反对票没有抓住要点。有人来到 Stack Overflow,收到了这个编译器错误,但是有一个抽象类,其中提供一个实现将是一个错误,没有一个好的解决方案,将不得不编写实现方法,抛出运行时异常,一个可怕的解决方案,直到他们有上述信息。无论 C # 要求这个显式性是好是坏,都超出了 Stack Overflow 的范围,与问题和答案都无关。

他们不必实际实现接口 。< br/> 接口方法/属性可以是抽象的,甚至可以是虚拟的。因此实际实现它们取决于子类。

与 Java 不同,在 C # 中: ”抽象类必须提供该类的基类列表中列出的接口的所有成员的实现。但是,允许抽象类将接口方法映射到抽象方法上。”

Https://msdn.microsoft.com/en-us/library/aa664595(v=vs.71).aspx