【问题标题】:C# Multiple inheritance replacementC# 多重继承替换
【发布时间】:2015-08-05 22:52:00
【问题描述】:

我正在寻找一种更好的方法来在 C# 中做一个简单的多重继承模式。

我有从 WPF 的 Window 类继承的主窗口和从窗口,我希望它们都具有另一个通用接口/功能。 我首先想到的是实现一个继承自 Window 的 BaseWindow 类,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;
        } 
    }
}

在这种情况下,避免代码重复的好方法是什么?

【问题讨论】:

  • 您可以尝试解决“必须直接从窗口继承”的问题。或者,您可以将CurrentView 属性提取到一个单独的类,并让您的窗口通过它的一个实例。
  • 使用组合而不是继承。 en.wikipedia.org/wiki/Object_composition
  • 我很难相信它们必须直接继承自Window,但是我有一段时间没有做过WPF,所以在这里无法做出有效的判断。

标签: c# wpf multiple-inheritance


【解决方案1】:

也许像这样使用类似 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()))
{

}

【讨论】:

  • 别忘了让你的类实现那个接口。
  • @DavidG 谢谢我补充说
  • 由于使用 BaseWindow(我在问题顶部提到过)而不是答案
  • @ILIABROUDNO 您根本不必从 BaseWindow 继承。我只是将代码保留在您的示例中,以便为您提供一个起点。您可以将所有内容放入界面并从Window正常继承。
猜你喜欢
  • 2017-03-31
  • 2011-11-17
  • 2012-05-14
  • 2013-08-28
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多