多重继承替换

本文关键字:替换 多重继承 | 更新日期: 2023-09-27 18:06:45

我正在寻找一个更好的方法在c#中做什么,否则将是一个简单的多重继承模式。

我有从WPF的窗口类继承的主和从窗口,我希望他们都有另一个共同的接口/功能。我首先想到实现一个BaseWindow类,它继承自Window,并且Slave和Master都继承自,
但是由于WPF中的一些问题,它们(主窗口和从窗口)必须直接从Window(而不是BaseWindow)继承。然后我定义了一个接口,像这样

public interface MasterOrSlaveWindow
{
    View CurrentView { get; set; }
}

并且Master和Slave都实现它:

public partial class SlaveWindwow : Window, MasterOrSlaveWindow
{
    protected View m_CurrentView = null;
    public View CurrentView { 
        get { return m_CurrentView; } 
        set 
        {
            if (value == null && m_CurrentView != null)
                m_CurrentView.Owner = null;
            m_CurrentView = value; 
            if (m_CurrentView != null) 
                m_CurrentView.Owner = this;
        } 
    }
}

它在实现不同的情况下工作,但对于相同的情况,我们有代码重复:

public partial class MasterWindwow : Window, MasterOrSlaveWindow
{
    protected View m_CurrentView = null;
    public View CurrentView { 
        get { return m_CurrentView; } 
        set 
        {
            if (value == null && m_CurrentView != null)
                m_CurrentView.Owner = null;
            m_CurrentView = value; 
            if (m_CurrentView != null) 
                m_CurrentView.Owner = this;
        } 
    }
}
在这种情况下,避免代码重复的好方法是什么?

多重继承替换

可以使用类似di的样式:

public interface IWindowHandler
{
    View GetCurrentView();
}
public class MasterWindowHandler : IWindowHandler
{
    public View GetCurrentView()
    {
    }
}
public class SomeOtherWindowHandler : IWindowHandler
{
    public View GetCurrentView()
    {
    }
}
// all your windows should inherit from this type
public class MyBaseWindow : Window
{
    protected IWindowHander _handler;
    public MyBaseWindow(IWindowHandler handler)
    {
        _handler = handler;
    }
    protected View m_CurrentView = null;
    public View CurrentView 
    { 
        get { return m_CurrentView; } 
        set 
        {
            // your code
        }
    } 
}
// a sample window code
public partial class MasterWindow : MyBaseWindow 
{
    public MasterWindow(IWindowHandler handler) : base(handler)
    {
    }
}

当然,你必须在窗口的实例化内部小心,但你可以很容易地改变实现而不触及窗口本身。

using (var window = new MasterWindow(new MasterWindowHandler()))
{
}