想象 一个有许多构造函数和一个虚方法的基类
public class Foo { ... public Foo() {...} public Foo(int i) {...} ... public virtual void SomethingElse() {...} ... }
现在我想创建一个覆盖虚拟方法的后代类:
public class Bar : Foo { public override void SomethingElse() {...} }
还有另一个做更多事情的后代:
public class Bah : Bar { public void DoMoreStuff() {...} }
我真的必须将所有构造函数从 Foo 复制到 Bar 和 Bah 吗?然后,如果我在 Foo 中更改构造函数签名,我是否必须在 Bar 和 Bah 中更新它?
有没有办法继承构造函数?有没有办法鼓励代码重用?
是的,您必须实现对每个派生有意义的构造函数,然后使用base关键字将该构造函数指向适当的基类,或者使用this关键字将构造函数指向同一类中的另一个构造函数。
base
this
如果编译器对继承构造函数做出假设,我们将无法正确确定我们的对象是如何实例化的。在大多数情况下,您应该考虑为什么有这么多构造函数,并考虑将它们减少到基类中的一两个。然后,派生类可以使用常量值屏蔽其中的一些,null并且只通过它们的构造函数公开必要的值。
null
在 C#4 中,您可以指定默认参数值并使用命名参数来使单个构造函数支持多个参数配置,而不是每个配置都有一个构造函数。