我的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 的范围,与问题或本答案无关。
。接口方法/属性可以是抽象的,甚至是虚拟的。因此,由子类来实际实现它们。