为什么在声明派生类时必须在接口之前指定基类?

时间:2011-04-15 10:48:27

标签: c# .net inheritance

public interface ITest
{
    int ChildCount { get; set; }
}

public class Test
{
}

public class OrderPool : ITest, Test
{
    public int ChildCount
    {
        get;
        set;
    }
}

错误说Base类'Test'必须在任何接口之前。 为什么有必要先扩展类然后实现接口?

7 个答案:

答案 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)

顺序清楚明了,基类可以实现派生类的接口成员,因此编译器必须事先知道它们