c# - 自动使基构造函数在派生类中可用?

标签 c# .net inheritance

我有一个带有两个构造函数的基类,需要一个参数:

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/

相关文章:

c# - Newtonsoft.JSON 无法转换具有 TypeConverter 属性的模型

c# - 在接口(interface)内部声明 IEnumerable<T>,同时在具体类中声明 IList<T>

c# - JSON 数组反序列化——元素的顺序是否始终保留?

java - 抽象类多重继承

c# - 如何在 activex 控件中使用/提取控件的标识

c# - C# 中类似 JavaScript 的动态属性

python - 如何使变量专属于类?

c++ - 如何在继承的类/结构中添加 union 成员

c# - 跨线程操作无效 : Control 'rchsdtOut' accessed from a thread other than the thread it was created on

c# - 详细的 View 状态大小