我的C#测试代码:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
导致以下编译器错误的结果:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
由于类Test
是一个抽象类,为什么编译器要求它实现接口?这个要求不应该只针对具体类吗?
我的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的范围,也与问题及其答案无关。Foo
中的定义更改为public abstract void IFoo.Bar();
,你会收到“public”和“abstract”不是有效修饰符的投诉。 - Darren Cook他们不必实际实现接口。接口方法/属性可以是抽象的甚至是虚拟的,因此由子类来实际实现它们。