关于语法:C#:抽象类需要实现接口吗?

C#: Abstract classes need to implement interfaces?

我在C中的测试代码:

1
2
3
4
5
6
7
namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

导致以下编译器错误:

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

由于类Test是一个抽象类,为什么编译器需要它来实现接口?这个要求不应该只对混凝土等级是强制性的吗?


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

1
2
3
4
5
6
7
8
9
interface IFoo
{
    void Bar();
}

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

或者换一种说法:您不必"实现"它(这对抽象类来说是一个可怕的限制);但是,在C中,您必须告诉编译器您是故意将责任传递给具体的子类的——上面的代码行显示了如何做到这一点。

抱怨这不是问题的答案的评论和否决缺少要点。有些人在堆栈溢出时,收到了这个编译器错误,但有一个抽象类,在该类中提供一个实现可能是一个错误,如果没有一个好的解决方案,他们将不得不编写抛出运行时异常的实现方法,这是一项可怕的工作,直到他们得到上述信息为止。C要求这种明确性是好是坏,这超出了堆栈溢出的范围,与问题或这个答案无关。


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

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


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