为什么构造函数不能继承?

时间:2009-01-08 23:31:16

标签: c# inheritance oop

我猜我有一些关于C#继承的基本内容,我不明白。有人请赐教我吗?

5 个答案:

答案 0 :(得分:31)

有时,在子类化时,您希望限制创建类实例所需的条件。

让我举个例子。如果类确实继承了它们的超类构造函数,那么所有类都将具有来自Object的无参数构造函数。显然这不正确。

答案 1 :(得分:29)

如果您考虑如果构造函数继承会发生什么,您应该开始看到问题。

作为nearly every type in .NET inherits from Object(具有无参数构造函数),这意味着您创建的几乎每个类型都将被强制使用无参数构造函数。但是有许多类型,其中无参数构造函数没有意义。

版本控制也会出现问题。如果基本类型的新版本与新构造函数一起出现,您将自动在派生类型中获得新的构造函数。这将是一件坏事,以及fragile base class问题的具体实例。

还有一个更哲学的论点。继承是关于类型责任(这就是我所做的)。构造函数是关于类型协作(这是我需要的)。因此,继承构造函数会将类型责任与类型协作混合在一起,而这两个概念应该保持独立。

答案 2 :(得分:11)

无论是否显式调用超类,都会调用超类中的构造函数。他们从父类下来。如果构造函数没有在其超类中显式调用构造函数,则在构造函数的代码之前隐式调用该类中的默认构造函数。

答案 3 :(得分:2)

我认为你的意思是:

class Foo
{
   public Foo(int someVar) {}
}

class Bar : Foo
{
    // Why does Bar not automatically have compiler generated version of 
    Bar(int someVar): Foo(someVar) {}
}

我相信这是继承自C ++(和Java) 但假设你确实有这个,而Bar有一些其他的成员变量。这是否会引入编译生成的构造函数的可用性,而不是初始化BAr的成员。

答案 4 :(得分:0)

将始终调用默认构造函数。

class Bar : Foo { }

当Bar被实例​​化时,它默认会调用Foo()构造函数。

class Foo {
    public Foo(int someVar) {}
}

class Bar : Foo {
    public Bar() : base(42) {}
}

如果没有无参数构造函数,则需要定义要使用的构造函数并传递参数。