繁体   English   中英

在基类之前调用​​派生类构造函数

[英]Call derived class constructor before base class

我需要在基类构造函数之前执行派生类构造函数。 我在基类中附加了使用虚拟对象的代码,需要在派生类中对其进行初始化。 我们在派生类中确定虚拟对象的类型,然后在获得该对象的类型后为其分配值。 在这种情况下,如何在基类构造函数之前调用派生类构造函数。

public class BaseClass : UserControl, INotifyPropertyChanged
{
    public Path ConnIn;
    public Path ConnOut;

    public virtual ObjectBase BaseObject { get; set; }

    public void BaseClass(XmlElementConfig config)
    {
        this.BaseObject.Title = config.Title;
        this.BaseObject.GroupID = config.GroupID;
    }
}

public partial class DerivedClass : CanvasBase
{
    private Audio_MonitorAction audio_objectAction;

    public override ObjectBase BaseObject
    {
        get { return audio_objectAction; }
        set
        {
            audio_objectAction = (Audio_MonitorAction)value;
            NotifyPropertyChanged();
        }
    }

    public DerivedClass(XmlElementConfig config) : base(config)
    {
        InitializeComponent();
        audio_objectAction = new Audio_MonitorAction(createGuid);
    }
}

“在基类构造函数之前执行派生类构造函数”是不可能的

如果可能,请将初始化移到BaseObject属性中(为什么它应该是虚拟的?)

public class BaseClass : UserControl, INotifyPropertyChanged
{
    public Path ConnIn;
    public Path ConnOut;

    private ObjectBase baseObject;
    public ObjectBase BaseObject
    {
        get { return baseObject; }
        set
        {
            baseObject = value;
            if (baseObject != null)
            {
                baseObject.Title = config.Title;
                baseObject.GroupID = config.GroupID;
            }
            NotifyPropertyChanged();
        }
    }

    XmlElementConfig config;
    public void BaseClass(XmlElementConfig config)
    {
        this.config = config;
    }
}
public partial class DerivedClass : CanvasBase
{
    private Audio_MonitorAction audio_objectAction;

    public DerivedClass(XmlElementConfig config) : base(config)
    {
        InitializeComponent();
        BaseObject = audio_objectAction = new Audio_MonitorAction(createGuid);
    }
}
public class BaseClass : UserControl, INotifyPropertyChanged
{
    public Path ConnIn;
    public Path ConnOut;

    public virtual ObjectBase BaseObject { get; set; }

    public void BaseClass(XmlElementConfig config)
    {
        InitBase(config);
    }
    protected void InitBase(XmlElementConfig config)
    {
        if (BaseObject != null)
        {
            BaseObject.Title = config.Title;
            BaseObject.GroupID = config.GroupID;
        }
    }
}
public DerivedClass(XmlElementConfig config) : base(config)
{
    InitializeComponent();
    audio_objectAction = new Audio_MonitorAction(createGuid);
    InitBase(config);
}

或者,您可以在BaseClass中调用虚拟函数,并在派生类中重写它。

public class BaseClass : UserControl, INotifyPropertyChanged
{
    public Path ConnIn;
    public Path ConnOut;

    public virtual ObjectBase BaseObject { get; set; }

    public void BaseClass(XmlElementConfig config)
    {
        InitDerivedClass();
        if (BaseObject != null)
        {
            BaseObject.Title = config.Title;
            BaseObject.GroupID = config.GroupID;
        }
    }
    protected virtual void InitDerivedClass() {}
}
public partial class DerivedClass : CanvasBase
{
    private Audio_MonitorAction audio_objectAction;

    public override ObjectBase BaseObject
    {
        get { return audio_objectAction; }
        set
        {
            audio_objectAction = (Audio_MonitorAction)value;
            NotifyPropertyChanged();
        }
    }
    protected override ObjectBase InitDerivedClass
    {
        audio_objectAction = new Audio_MonitorAction(createGuid);
    }
    public DerivedClass(XmlElementConfig config) : base(config)
    {
        InitializeComponent();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM