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

问题描述 投票:0回答:3

我的C#测试代码:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

导致以下编译器错误:

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

既然类

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

c# syntax interface abstract-class
3个回答
196
投票

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


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

或者换句话说:你
不必

必须“实现”它(这对抽象类来说是一个可怕的限制);然而,在 C# 中,您必须告诉编译器您是故意将责任推给具体的子类 - 上面的代码行显示了如何执行此操作。

抱怨这不是问题答案的评论和反对票没有抓住要点。有人来到 Stack Overflow,收到了这个编译器错误,但有一个抽象类,在该类中提供实现是错误的,但没有一个好的解决方案,就陷入困境 - 必须编写抛出运行时异常的实现方法,这是一项可怕的工作- 周围 - 直到他们获得上述信息。 C# 要求这种明确性是好还是坏超出了 Stack Overflow 的范围,与问题或本答案无关。


16
投票

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


7
投票
他们不必实际实现接口

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

© www.soinside.com 2019 - 2024. All rights reserved.