多重继承替换
本文关键字:替换 多重继承 | 更新日期: 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()))
{
}