让我们以C#为例
public class Foo
{
public Foo() { }
public Foo(int j) { }
}
public class Bar : Foo
{
}
现在,除了构造函数之外,所有Foo的公共成员都可以在Bar中访问。
Bar bb = new Bar(1);
为什么构造函数不可继承?更新: 我知道我们可以链式调用构造函数,但我想知道为什么上述的构造方法是无效的。我相信一定有一个合理的原因。
让我们以C#为例
public class Foo
{
public Foo() { }
public Foo(int j) { }
}
public class Bar : Foo
{
}
现在,除了构造函数之外,所有Foo的公共成员都可以在Bar中访问。
Bar bb = new Bar(1);
为什么构造函数不可继承?(代码示例)
public class Foo
{
public Foo() { }
public Foo(int j) { }
}
public class Bar : Foo
{
public Bar() : base() { }
public Bar(int j) : base(j) { }
}
引入构造函数到一个类中的原因之一是因为在没有特定的“依赖项”时,拥有该类的实例是没有意义的。例如,它可能是一个数据访问类,必须具有与数据库的连接:
public class FooRepository
{
public FooRepository(IDbConnection connection) { ... }
}
var badRepository = new FooRepository();
Foo
构造函数只能知道如何初始化一个 Foo 对象,因此它不应该也知道如何初始化任何可能的子类。 < /p >
public class Bar : Foo
{
public Bar(int i) : base(i) { }
}
我认为你可以这样做:
public class Bar : Foo
{
public Bar (int i)
: base (i)
{
}
}
我可能有点偏离——但这是大致的想法。
简单的答案是,语言不是那样工作的。
但你真正想问的问题是为什么它不是那样工作的 :-) 好吧,这是一个任意的选择,并且它遵循了C++和Java(以及很可能影响C#的许多其他语言)。
可能的原因是编译器只会生成一个不带参数的构造函数,并简单地调用父类,如果你想要更多,就需要自己实现。这是最好的选择,因为很可能你需要做的不仅仅是调用父类构造函数。
实际上,这是因为父构造函数无法完全初始化子对象。构造函数在这方面有点个人化。这就是为什么大多数语言不继承构造函数的原因。