使用新的嵌套类

时间:2016-05-02 18:58:55

标签: c# generics inheritance reflection types

第一个问题,所以我愿意接受有效参与StackOverflow社区以及与此问题相关的建议。

我在C#中使用基于文本的UI。我有一个抽象窗口类和一个抽象控件类,每个类都为继承它们的类型实现了通用功能(例如弹出窗口或文本框控件)。目前,在可能实现库的程序中,开发人员必须创建窗口对象和控件对象,然后将控件添加到各自的窗口,将窗口添加到窗口管理器类,如下所示:

var mainWindow = new MainWindow(...);
var textBox1 = new TextBox(...);
mainWindow.AddControl(textBox1);
WindowManager.Add(mainWindow);

这很有效,但有点笨重。由于控件永远不应该存在于窗口之外,因此我希望将控件类型实现为嵌套类型。但是,为了保持程序的可扩展性,我希望有一种方法可以使用新的控件类型扩展窗口类。我的问题是:我应该使用反射,还是依赖开发人员使用容器类来扩展窗口类?或者,是否有更好的方法来构建程序,而不是它目前的布局?

我也考虑过使用泛型,例如:

public abstract class Window : DrawableObject, IWindow
{
    public void AddControl <T>(object[] constructorArgs) where T : class, IControl
    {

    }
}

我的目标是在不牺牲可扩展性/松耦合的情况下实现简单。提前感谢任何想法!

编辑:应该澄清一下,主要原因是修复Windows和控件如何合作的一些奇怪之处。每个控件都有一个parentWindow属性,用于访问控件所在的窗口,用于各种目的,例如为特定窗口创建退出按钮等。

现在,这个属性被传递给构造函数,但这对我来说似乎是多余的,因为在这样做之后你必须将控件添加到窗口的控制列表中。我想在控件添加到窗口时找到一种设置此属性的方法,但是在仅添加控件时将此操作限制为,以防止在此上下文之外更改parentWindow属性时可能出现的问题

1 个答案:

答案 0 :(得分:0)

编码AddControl方法的方式:

   public void AddControl <T>(object[] constructorArgs)
        where T : class, IControl
   {
   }

您希望开发人员只提供类型,您的AddControl方法将使用constructorArgs创建它的实例。此方法本身隐式强制您使用反射。其他任何事都没有机会。因为要添加类型T的控件,所以需要创建类型T的控件实例。由于您的Window类没有关于T反射的线索是唯一的解决方案。 为了方便其他方法,您可能需要考虑AddControl的一些重载。

   public virtual T AddControl <T>()
      where T : class, new(),IControl
   {
        //now you can create instance no reflection required
        var control = new T();
        this.Controls.Add(control);
        return control;
   }

   public void AddControl <T>(T control)
      where T : class, IControl
   {
   }

   public abstract void AddControl <T>(object[] constructorArgs)
      where T : class, IControl;

创建一个抽象方法会在子类上传递实现的onus,并且可以处理创建T的新实例,其中T的假设类型是已知的,或至少所有已知类型的T可能被处理的情况。 这是一个广泛的主题,我猜也是主观的。 OOP的最佳用途是实现符合您逻辑目标的设计。