过去,我使用继承来允许在应用程序中扩展Windows窗体。如果我所有的表单都具有公共控件,插图和功能,那么我将创建一个实现公共控件和功能的基本表单,然后允许其他控件从该基本表单继承。但是,我在设计时遇到了一些问题。
控件一次只能放在一个容器中,因此您拥有的任何静态控件都将很棘手。例如:假设您有一个称为BaseForm的基本表单,其中包含一个TreeView,并对其进行了保护和静态处理,以便此类的所有其他(派生)实例都可以修改和显示相同的TreeView。这对于从BaseForm继承的多个类不起作用,因为TreeView一次只能位于一个容器中。它可能在初始化的最后一个表单上。尽管每个实例都可以编辑该控件,但在给定时间只能显示一个。当然,有一些变通方法,但是它们都很丑陋。(这对我来说似乎是一个非常糟糕的设计。为什么多个容器不能存储指向同一对象的指针?无论如何,它就是它。)
表单之间的状态,即按钮状态,标签文本等,我必须使用全局变量并在Load上重置状态。
Visual Studio的设计师并不能很好地支持此功能。
是否有更好但仍易于维护的设计可供使用?还是形式继承仍然是最好的方法?
更新 从查看MVC到MVP,从观察者模式到事件模式。这是我目前的想法,请批评:
我的BaseForm类将仅包含控件以及与这些控件相关的事件。需要任何逻辑来处理它们的所有事件都将立即传递给BaseFormPresenter类。此类将处理来自UI的数据,执行任何逻辑操作,然后更新BaseFormModel。该模型会将事件(状态更改时将触发)的事件公开给Presenter类,该类将订阅(或观察)该事件。演示者收到事件通知后,它将执行任何逻辑,然后演示者将相应地修改视图。
内存中每个Model类只有一个,但是可能存在许多BaseForm实例,因此有BaseFormPresenter。这将解决我将BaseForm的每个实例同步到相同数据模型的问题。
问题:
哪一层应该存储最后按下的按钮之类的内容,以便我可以在表单之间为用户(例如CSS菜单中)突出显示它?
请批评这个设计。谢谢你的帮助!