我有一个带有两个构造函数的基类,需要一个参数:
public abstract class StoreBase
{
private readonly SomeObject_sobj;
protected StoreBase(SomeObject sobj)
{
_sobj = sobj;
}
protected StoreBase(OtherObject oobj)
{
_sobj = new SomeObject(oobj);
}
}
然后我有一个派生类:
public class MyDerived: StoreBase
{
}
这会导致编译错误,如下所示base class doesn't contain parameterless constructor
.
我的理解是,因为 MyDerived 不包含构造函数,所以编译器添加了一个无参数构造函数(这是众所周知的,与派生类无关)。但是,由于它派生自另一个类,因此需要首先运行基类构造函数,并且无法确定应从空的 MyDerived 构造函数运行哪个构造函数。
基本上我在问:如果我真的不需要额外的构造函数逻辑,我可以避免将所有构造函数从 Base 复制/粘贴到派生类中吗?我可以说“从基础中获取所有构造函数”而不将它们全部添加吗?
(是的,我知道我可以/应该将其重构为无参数构造函数和受保护的虚拟 Initialize() 方法。但我仍然想知道我是否可以使用构造函数并仍然避免复制/粘贴)
不 - 您还需要在派生类中实现(适当的)构造函数。
派生类只需要使用基类构造函数之一——因此其中所需的构造函数可能与基类完全不同。它们需要手动实现,即使只是:
public class MyDerived : StoreBase
{
public MyDerived(SomeObject sobj) : base(sobj) {}
public MyDerived(OtherObject oobj) : base(oobj) {}
}
Also:
(是的,我知道我可以/应该将其重构为无参数构造函数和受保护的虚拟 Initialize() 方法。但我仍然想知道我是否可以使用构造函数并仍然避免复制/粘贴)
尽管我看到有人吹捧这一点,但我相信这并不总是一个好的做法。在许多情况下,这实际上是有问题的,因为如果子类重写了受保护的虚拟方法,则您依赖子类来正确调用 Initialize。例如,如果子类这样做,它可能会非常糟糕:
public class MyDerived : StoreBase
{
// .. other stuff
protected override void Initialize()
{
// Leave out, intentionally or accidentally, the following:
// base.Initialize();
}
}
实际上,在大多数情况下我都会避免这种情况,并在构造函数中(或在私有的非虚拟初始化方法中)进行初始化。不这样做会破坏您对初始化始终按照您想要的方式进行的任何保证。
构造函数和构造函数链提供相同的功能,但有更好的保证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)