36

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

4

5 回答 5

34

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

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

于 2009-01-08T23:51:43.543 回答
29

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

由于.NET 中几乎所有类型都继承自 Object(它有一个无参数构造函数),这意味着您创建的几乎每个类型都将被迫有一个无参数构造函数。但是有很多类型的无参数构造函数没有意义。

版本控制也会有问题。如果你的基类型的新版本出现了一个新的构造函数,你会在你的派生类型中自动获得一个新的构造函数。这将是一件坏事,也是脆弱基类问题的一个具体实例。

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

于 2009-01-09T01:24:30.113 回答
12

超类中的构造函数被调用,无论你是否显式调用它们。它们从父类向下链接。如果您的构造函数没有显式调用其超类中的构造函数,则该类中的默认构造函数会在构造函数代码之前隐式调用。

于 2009-01-08T23:41:45.140 回答
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 的成员的可能性。

于 2009-01-08T23:52:56.350 回答
0

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

class Bar : Foo { }

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

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

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

如果没有无参数构造函数,您将需要定义使用哪一个并传递参数。

于 2009-01-08T23:44:37.177 回答