【发布时间】:2016-08-27 15:28:35
【问题描述】:
第一个问题,因此我愿意接受有关有效参与 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 属性时出现潜在问题。
【问题讨论】:
-
我不知道您通过添加该通用方法真正获得了什么。如果我使用它,我希望能够构造我的对象,然后告诉窗口显示它,而不是让窗口为我构造对象。
-
你是对的。支持激活操作的每种控件类型都将委托
ControlAction(IControl source)作为构造函数参数,并且能够根据来自另一个控件的输入对一个控件执行操作非常有用,如果不能构造和引用控件,这将非常困难窗外。我可以将 ref 返回到创建的控件,但这将是多余的。每个控件还需要一个IWindow parentWindow,所以也许应该在其构造函数代码中将控件添加到其窗口?或者在添加到窗口时设置它的 parentwindow 属性。 -
在将控件添加到窗口时设置它的父窗口似乎是最有意义的,但我宁愿不公开父窗口的设置器,因为在这种情况下它应该只设置添加到窗口时。不过,我可能只需要解决,让它万无一失可能是愚蠢的差事。
标签: c# generics inheritance reflection types