代码之家  ›  专栏  ›  技术社区  ›  James

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

  •  13
  • James  · 技术社区  · 16 年前

    这里的问题是,我希望将对象传递给派生类,但必须在基类构造函数之前完成,因为基类将立即调用派生类的 Start() 使用对象的方法。

    下面是基类的一个摘录,(重命名自 BarcodeScanner 为方便起见)。

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

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

    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()); 
        }
    }
    

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

    我通过将initialize/start if块放在 MyDerived 构造函数。但是,还有其他从基类派生的类;所以我最终不得不在每个派生类中重复这个初始化/启动代码块。我想看看修改基类的替代方法。

    3 回复  |  直到 16 年前
        1
  •  17
  •   Andrew Hare    16 年前

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

        2
  •  17
  •   Adam Ralph    16 年前

    我知道你的设计错了。您不应该从构造函数内启动该进程。当需要时,使用代码应该显式调用start()方法。

        3
  •  1
  •   Reed Copsey    16 年前

    我将修改您的设计,以便在构造之后调用初始化(并且可能是start()——虽然我通常会让这是一个由用户调用的公共方法)。

    如果你在做条形码扫描仪,你可以在第一次扫描的时候做这个。只是懒惰地使用派生类中的数据初始化成员。

    这可以解决您的问题,用户的使用不会发生真正的变化。