繁体   English   中英

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

[英]C#: Abstract classes need to implement interfaces?

我在C#中的测试代码:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

导致以下编译器错误:

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

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

在C#, 需要实现一个接口的类定义接口的所有成员。 在抽象类的情况下,您只需使用abstract关键字定义这些成员:

interface IFoo
{
    void Bar();
}

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

或者换句话说:你不必 “实现”它(这对抽象类来说是一个可怕的限制); 但是,在C#中,您必须告诉编译器您是故意将降级传递给具体的子类 - 上面的代码行显示了如何执行此操作。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM