我有一个带有两个构造函数的基类,需要一个参数:
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
{
}
这会导致编译错误,因为基类不包含无参数构造函数
。
我的理解是,因为 MyDerived 不包含构造函数,所以编译器添加了一个无参数构造函数(这是众所周知的,与派生类无关)。但是,由于它派生自另一个类,因此需要先运行基类构造函数,并且无法从空的 MyDerived 构造函数中确定应该运行哪个构造函数。
基本上我在问:如果我真的不需要额外的构造函数逻辑,我可以避免将所有构造函数从 Base 复制/粘贴到 Derived 类吗?我可以说“从基础中获取所有构造函数”而不全部添加它们吗?
(是的,我知道我可以/应该将其重构为一个无参数构造函数和一个 protected 虚拟 Initialize() 方法。但我仍然想知道我是否可以使用构造函数并仍然避免复制/粘贴)
最佳答案
否 - 您还需要在派生类中实现(适当的)构造函数。
派生类只需要使用其中一个基类构造函数——因此其中所需要的构造函数可能与基类完全不同。它们将需要手动实现,即使只是:
public class MyDerived : StoreBase
{
public MyDerived(SomeObject sobj) : base(sobj) {}
public MyDerived(OtherObject oobj) : base(oobj) {}
}
还有:
(And yes, I know I could/should refactor this into a parameterless constructor and a protected virtual Initialize() method. but I still wonder if I can work with constructors and still avoid copy/paste)
虽然我看到这是吹捧的,但我相信这并不总是一个好的做法。在许多情况下,这实际上是有问题的,因为如果子类覆盖了 protected 虚方法,您将依赖子类正确调用 Initialize。例如,如果子类这样做,它可能会非常糟糕:
public class MyDerived : StoreBase
{
// .. other stuff
protected override void Initialize()
{
// Leave out, intentionally or accidentally, the following:
// base.Initialize();
}
}
我实际上在大多数情况下都避免了这种情况,并在构造函数中进行初始化(或在私有(private)的、非虚拟的初始化方法中)。不这样做会破坏您对初始化将始终按预期方式进行的任何保证。
构造函数和构造函数链提供相同的功能,并提供更好的保证。
关于c# - 自动使基构造函数在派生类中可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2095749/