【问题标题】:Why must the base class be specified before interfaces when declaring a derived class?为什么在声明派生类时必须在接口之前指定基类?
【发布时间】:2011-08-06 05:51:06
【问题描述】:
public interface ITest
{
    int ChildCount { get; set; }
}

public class Test
{
}

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

错误表明基类“测试”必须位于任何接口之前。 为什么要先扩展类,再实现接口?

【问题讨论】:

    标签: c# .net inheritance


    【解决方案1】:

    因为specification 在第 17.1.2 节中是这样说的。

    【讨论】:

    • +1,同样在 Java 中,您首先必须编写 extends,然后再编写 implements。它更符合逻辑,也许在其他语言(C# 和 Java 除外)中是一样的。
    • 请在您的回答中包含规范中的相关部分。我觉得第二个链接坏了。
    【解决方案2】:

    C# 仅支持单个 继承,但允许类实现多个 接口。既然如此,按照惯例总是将基类指定在同一个地方要清楚得多,而不是与一堆接口混合在一起。

    不管约定如何,the specification mandates that this is the case 无论如何,这就是您看到该错误的原因。

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

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

    【讨论】:

      【解决方案3】:

      叫做语法

      为了让编译器编译代码,您必须遵循约定

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          因为您可以只扩展一个类并实现多个接口,所以首先让类更易于阅读。而且可能语法本身更容易这样写,只是一个伪语法可能是:

          class CLASSNAME:baseclass? interface*
          

          意思是可选的基类后跟许多接口,编写一种语法,只允许一个类在某个地方搞砸是很困难的。

          【讨论】:

          • 我同意 - 它使语法更容易指定。
          【解决方案6】:

          你只能从一个基类继承许多接口。因此,如果列出的类型不止一种,您就知道第一种是类,其他类型是接口。无论类/接口命名约定如何,这都有效

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2012-01-23
              • 1970-01-01
              • 2017-07-04
              • 1970-01-01
              • 1970-01-01
              • 2020-01-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多