【问题标题】:Call derived class constructor before base class在基类之前调用​​派生类构造函数
【发布时间】:2018-03-14 08:07:56
【问题描述】:

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

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

【问题讨论】:

  • 我也有同样的问题。您应该如何在基本构造函数中使用虚拟方法,为什么无论如何都要实现这个废话错误。在C++中你不需要先调用基础构造函数,为什么你需要像javascript这样一种耦合非常松散的语言。

标签: c# wpf inheritance constructor overriding


【解决方案1】:

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

如果可能,将初始化移到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);
    }
}

【讨论】:

  • 您编写的代码是实现单一基类和派生类继承的最简单和优化的方法。但是我从基类派生了20多个不同的类,你写的解决方案需要写20多次。我问的是在派生构造函数之后调用基本构造函数。如果您没有正确的解决方案,您也会对我的问题给出否定标记,这不是正确的方法。您还从我的班级中删除了虚拟和覆盖的概念,这是必要的。我想要的代码可以写在一个语句中,不需要单独调用。
  • 简短回答:“在基类构造函数之前执行派生类构造函数”不可能
【解决方案2】:
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();
    }
}

【讨论】:

  • @Rekshinno 您编写的代码是实现单一基类和派生类继承的最简单和优化的方法。但是我从基类派生了20多个不同的类,你写的解决方案需要写20多次。我问的是在派生构造函数之后调用基本构造函数。如果您没有正确的解决方案,您也会对我的问题给出否定标记,这不是正确的方法。我想要的代码可以写在一个语句中,不需要单独调用。
  • @Praveensharma 首先 - 我没有对你投反对票。第二 - 见 ASh 的评论。您不能在方法中调用基本构造函数,将其提取到方法中,或者按照 ASh 的建议将其放入基本设置器中。
  • 感谢您的替代解决方案。它对我有用,现在代码似乎是最简单的形式,只能从一个中心位置调用。
猜你喜欢
  • 2014-11-17
  • 1970-01-01
  • 2016-07-19
  • 2018-07-21
  • 2015-08-18
  • 2018-07-16
  • 2013-01-05
  • 2011-05-03
  • 2012-05-19
相关资源
最近更新 更多