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

本文关键字:基类 接口 派生 声明 为什么 | 更新日期: 2023-09-27 17:50:28

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

错误提示基类'Test'必须出现在任何接口之前。为什么必须先扩展类,然后实现接口?

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

因为规范在§17.1.2中这么说。

c#只支持单个继承,但允许类实现多个接口。在这种情况下,总是按照约定在同一位置指定基类,而不是将基类与一堆接口混合在一起,这样会更清晰。

不管约定如何,规范要求无论如何都是这样的,这就是为什么你会看到这个错误。

请记住,规范中没有规定所有的接口都必须用大写的"I"来命名。-这只是惯例。因此,如果您的类实现的接口不遵循该约定,并且如果规范允许您以任意顺序指定基类和接口,那么您将无法轻松地分辨哪个标识符是基类,哪个标识符是接口。例子:

class MyDerivedClass : A, B, C, D, E   // which is the base class?  
{
...
}

叫做语法

约定,为了让编译器编译代码,你必须遵循这些约定。

他们可以选择允许这两种形式,或者正好相反,但是他们没有。原因可能很清楚:您可以定义很多接口,但只能从一个类继承。

从技术上讲,允许它们以随机顺序排列是可能的,但这会使代码的可读性降低。

很简单,因为语言就是这样设计的。原因可能是一个类只能有一个基类,但是实现任意数量的接口。

因为您可以只扩展一个类并实现多个接口,所以将类放在首位更容易阅读。也许语法本身更容易这样写,只是一个伪语法可以是:

class CLASSNAME:baseclass? interface*

意味着可选的基类后面跟着许多接口,编写一种语法,只允许一个类在某处混乱,这将是困难的,没有任何原因。

您只能从继承一个基类,但可以继承多个接口。如果列出了不止一个类型你就知道第一个是类,其他的是接口。不管类/接口的命名约定如何

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