我在C#中的测试代码:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
导致以下编译器错误:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
由于类Test
是抽象类,为什么编译器要求它实现接口?对于具体的课程,这个要求不应该只是必修吗?
答案 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)
他们不必实际实现接口。
接口方法/属性也可以是抽象的,甚至也可以是虚拟的。所以它由子类来实际实现它们。