【问题标题】:Is there a convention for using Inherited Constructors是否有使用继承构造函数的约定
【发布时间】:2010-07-02 23:12:30
【问题描述】:

我知道在继承类的时候,也可以继承Constructors

示例:

class Book : Genre
{
    Book(string param1, int param2, string inherit1, string inherit2) : Base(inherit1,inherit2)
    {
        Prop1 = param1
        Prop2 = param2
    }
}

但是通过继承类中的构造函数设置继承属性不是更容易吗?而不是引用基础构造函数?

class Book : Genre
{
    Book(string param1, int param2, string inherit1, string inherit2)
    {
        Prop1 = param1
        Prop2 = param2
        InhProp3 = inherit1
        InhProp4 = inherit2
    }
}

【问题讨论】:

  • 请不要在标题中重复“C#”之类的标签。将它们留在标签中。

标签: c# inheritance constructor


【解决方案1】:

但它是不同的。设置属性没有相同的行为。

当您使用带参数的基类构造函数时,基类能够设置这些属性,并且可能具有基于这些参数的自定义行为,这些行为在子类构造函数之前运行。

如果在子类构造函数中手动设置属性,则基类构造函数已经运行。这可能会改变行为 - 有时会显着改变(尤其是在基类设计不佳的情况下)。

此外,如果基类需要这些信息来构建自身,那么您别无选择。通常,构造函数参数不仅仅是设置类的属性——它们对于对象本身的构造也很关键。

【讨论】:

    【解决方案2】:

    如果您的基类在某个时间点被重新设计以执行比设置成员更复杂的事情,那么您会很高兴调用它。

    如果没有,您将寻找错误,可能需要几个小时的调试才能找到它。然后您将永远不会忘记再次将调用委托给基类的构造函数:-)

    【讨论】:

      【解决方案3】:

      基类可以做的不仅仅是设置属性。基类可能是一个你没有源代码的类,所以你甚至不知道它是做什么的。

      【讨论】:

        【解决方案4】:

        基本构造函数可能不仅仅是设置属性,它可能会检查空引用。如果您要在继承类中执行此操作,则需要重复所有代码。然后你会在两个地方有相同的代码,所以如果代码必须改变,你必须知道它需要在两个地方都改变。

        【讨论】:

          【解决方案5】:

          取决于类的设计方式。

          也许属性是public get; private set; 在这种情况下,您的派生类无权设置属性。

          另外,iirc 调用构造函数来设置参数,生成的 IL 比在构造函数主体中设置值要少。

          【讨论】:

            猜你喜欢
            • 2013-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-01
            • 2023-04-03
            相关资源
            最近更新 更多