在C#中的基础构造函数之前执行派生的构造函数

Jam*_*mes 16 c# constructor abstract-class derived-class

我的问题是我想将一个对象传递给派生类,但它必须在基类构造函数之前完成,因为基类将立即调用派生类Start()使用该对象的方法.

以下是基类的摘录(为方便起见,从BarcodeScanner重命名).

public abstract class MyBase
{    
    public MyBase()
    {
        if (Initialize())
            this.Start();
    }

    public abstract bool Initialize();
    public abstract void Start();
}
Run Code Online (Sandbox Code Playgroud)

这是我正在创建的派生类.

class MyDerived : MyBase
{
    private string sampleObject;

    public MyDerived (string initObject)
    {
        sampleObject = initObject;
    }

    public override bool Initialize() 
    { 
        return GetDevice();
    }
    public override void Start() 
    { 
        Console.WriteLine("Processing " + sampleObject.ToString()); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我怀疑你可以让C#在基础构造函数之前执行派生构造函数; 所以我真的只是在寻找一个解决方案,在使用对象之前将对象传递给派生类.

我通过在MyDerived构造函数中放置Initialize/Start if块来解决这个问题.但是,还有其他类派生自基类; 所以我最终不得不在每个派生类中重复这个Initialize/Start代码块.我想看一个修改基类的替代方法.

Ada*_*lph 19

恕我直言你的设计是错误的.您不应该从构造函数中启动该过程.您的消费代码应在需要时显式调用Start()方法.

  • +1.这就是着名的"InitializeComponent"出现的原因.你应该吐构造和初始化逻辑.让你的"初始化"让我们说"受保护的虚拟"并在派生类中覆盖它.您将能够决定"base.InitializeComponent"调用应该是第一个还是最后一个. (3认同)

And*_*are 18

你想要做的事情在C#中是不可能的.必须在任何派生类的构造函数之前运行基类中的构造函数,否则可能存在损坏的对象状态.子对象必须能够假定其基础是完全构造和可用的.

  • 好吧,可以创建空覆盖Initialize/Start方法,并将这些代码移动到derivedInitialize/derivedStart方法中,然后在派生构造函数中调用`if(derivedInitialize())derivedStart()`.可能没有优雅的解决方案,但还有其他方法. (2认同)