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

时间:2010-04-24 16:12:51

标签: c# syntax interface abstract-class

我在C#中的测试代码:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

导致以下编译器错误:

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

由于类Test抽象类,为什么编译器要求它实现接口?对于具体的课程,这个要求不应该只是必修吗?

3 个答案:

答案 0 :(得分:125)

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

interface IFoo
{
    void Bar();
}

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

或者换句话说:必须“实现”它(这对抽象类来说是一个可怕的限制);但是,在C#中,你必须告诉编译器你故意将buck转移到具体的子类 - 上面的代码行显示了如何这样做。

抱怨说这不是问题的答案的评论和支持者忽略了这一点。有人来到Stack Overflow,收到了这个编译错误,但是有一个抽象类,其中提供一个实现是一个错误,没有一个好的解决方案 - 将不得不编写引发运行时异常的实现方法,一个可怕的工作 - 在他们拥有上述信息之前。 C#需要这种显式性是好还是坏都超出了Stack Overflow的范围,与问题和答案无关。

答案 1 :(得分:10)

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

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

答案 2 :(得分:3)

他们不必实际实现接口
接口方法/属性也可以是抽象的,甚至也可以是虚拟的。所以它由子类来实际实现它们。