public interface ITest
{
int ChildCount { get; set; }
}
public class Test
{
}
public class OrderPool : ITest, Test
{
public int ChildCount
{
get;
set;
}
}
错误说Base类'Test'必须在任何接口之前。 为什么有必要先扩展类然后实现接口?
答案 0 :(得分:16)
因为specification在第17.1.2节中说明了这一点。
答案 1 :(得分:8)
C#仅支持单继承,但允许类实现多个接口。在这种情况下,总是按照约定在同一个地方指定基类,而不是与一堆接口混合在一起更清楚。
无论如何,无论如何, the specification mandates that this is the case ,这就是您看到错误的原因。
请记住,规范中没有任何内容表明所有接口都必须以大写“I”命名。 - 那只是惯例。因此,如果您的类实现了不遵循该约定的接口,并且如果规范允许您以任何顺序指定基类和接口,那么您将无法轻易分辨哪个标识符是基类,哪个是接口。例如:
class MyDerivedClass : A, B, C, D, E // which is the base class?
{
...
}
答案 2 :(得分:3)
它被称为语法
您必须遵循 约定 ,以便编译器编译代码。
他们本可以选择允许两种形式,或者只是相反,但他们没有。 原因可能是明确的:您可以定义许多接口,只从一个类继承。
从技术上讲,它可以以随机顺序允许它们,但这会使代码的可读性降低。
答案 3 :(得分:2)
仅仅因为语言是这样设计的。原因可能是一个类只能有一个基类,但可以实现任意数量的接口。
答案 4 :(得分:2)
因为您可以只扩展一个类并实现多个接口,所以首先让类更容易阅读。也许语法本身更容易编写,只是伪语法可能是:
class CLASSNAME:baseclass? interface*
意味着可选的基类后跟许多接口,编写一个语法,只允许一个类在某个地方混乱,这将是困难的。
答案 5 :(得分:1)
您只能从一个基类继承,但许多接口。因此,如果列出的类型不止一个,您就知道第一个类是一个类,其他类接口。无论类/接口命名约定如何,这都有效。
答案 6 :(得分:1)
顺序清楚明了,基类可以实现派生类的接口成员,因此编译器必须事先知道它们