我猜有一些关于 C# 继承的基本知识我不明白。有人请赐教吗?
5 回答
有时,在子类化时,您希望限制创建类实例所需的条件。
让我给你举个例子。如果类确实继承了它们的超类构造函数,那么所有类都将具有来自Object
. 显然这是不正确的。
如果您考虑如果构造函数被继承会发生什么,您应该开始看到问题。
由于.NET 中几乎所有类型都继承自 Object(它有一个无参数构造函数),这意味着您创建的几乎每个类型都将被迫有一个无参数构造函数。但是有很多类型的无参数构造函数没有意义。
版本控制也会有问题。如果你的基类型的新版本出现了一个新的构造函数,你会在你的派生类型中自动获得一个新的构造函数。这将是一件坏事,也是脆弱基类问题的一个具体实例。
还有一个更哲学的论点。继承与类型责任有关(这就是我所做的)。构造函数是关于类型协作的(这是我需要的)。因此,继承构造函数会将类型责任与类型协作混合在一起,而这两个概念应该真正保持分离。
超类中的构造函数被调用,无论你是否显式调用它们。它们从父类向下链接。如果您的构造函数没有显式调用其超类中的构造函数,则该类中的默认构造函数会在构造函数代码之前隐式调用。
我假设你的意思是:
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 的成员的可能性。
默认构造函数将始终被调用。
class Bar : Foo { }
当 Bar 被实例化时,它将默认调用 Foo() 构造函数。
class Foo {
public Foo(int someVar) {}
}
class Bar : Foo {
public Bar() : base(42) {}
}
如果没有无参数构造函数,您将需要定义使用哪一个并传递参数。