是否存在使用Inherited Constructors的约定

时间:2010-07-02 23:12:30

标签: c# inheritance constructor

我知道在继承类时,您也可以继承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
    }
}

5 个答案:

答案 0 :(得分:4)

但是,情况有所不同。设置属性的行为不同。

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

如果在子类构造函数中手动设置属性,则基类构造函数已经运行。这可能会改变行为 - 有时候会显着改变(特别是如果基类的设计很差)。

此外,如果基类需要该信息才能构建自身,那么您别无选择。通常,构造函数参数不仅仅是设置类的属性 - 它们对于构造对象本身至关重要。

答案 1 :(得分:3)

如果某个时间点的基类经过重新设计,做的事情比设置成员更复杂,那么你很乐意调用它。

如果没有,你会找到一个错误,经过几个小时的调试后找到它。然后你永远不会忘记再次将调用委托给基类的构造函数: - )

答案 2 :(得分:1)

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

答案 3 :(得分:1)

基础构造函数可能不仅仅是设置属性,它可能例如检查空引用。如果你在继承类中这样做,那么你需要重复所有的代码。然后你会在两个地方拥有相同的代码,所以如果代码必须改变,你必须知道它需要在两个地方都有所改变。

答案 4 :(得分:1)

取决于课程的设计方式。

可能属性为public get; private set;在这种情况下,派生类无权设置属性。

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