现在我正在编写一个应用程序,并且我认为必须有一个更好的解决方案来解决我现在正在做的事情。
我有一个主窗口,可以处理程序的设置。然后我有更多的课程和窗口。例如,语言处理程序类和处理“main函数”所需的用户输入的表单。
但是,到目前为止,我总是必须将主窗口传递给每个类,因为语言处理程序应该能够更改主窗口的字符串。另一种形式也应该能够将数据传递给主窗口。
如果我们想象会有更多的类,并且每个类都需要主窗口的副本,这将消耗大量资源,具体取决于主窗口的“大小”。
那么,是否有更好/更有效的方法在这些类之间进行通信。
答案 0 :(得分:10)
这样做的常用方法是使用observer pattern,它在.NET中为events system。简单地说,您的类订阅彼此的事件并在事件发生时执行操作。正如注释中所指出的,传递引用并不是内存繁重,但它会导致代码的不同部分之间的紧密耦合 - 观察者模式解决了这个问题。
答案 1 :(得分:3)
另一种选择是将您的课程视为服务。将它们编码到接口,然后使用dependency injection(又名控制反转)来构建对象图(您告诉IoC容器您需要frmSomething
,它将确定它需要哪些服务/类,适当地实例化它们。
这意味着:
OldTranslator
交换为NewTranslator
,只要它们都符合相同的界面,除了容器的配置之外不需要更改任何内容)< / LI>
查看MS支持的DI容器Unity。 Castle Windsor是一种受欢迎的选择,但还有更多
值得注意的是,正如你所说的那样传递主窗口的“复制”并不是一件坏事 - 你只是将一个引用(实际上是一个指针)传递给主窗口(因为任何比真实基元更复杂的是引用类型)。这意味着无论如何都有很小的开销
答案 2 :(得分:2)
答案 3 :(得分:2)
除了IVAN给出的ans之外..如果我们在没有所有这些术语的情况下查看更高级别的视图,那么你应该创建一个静态类,它将服务器作为InMemoryStorage并在其上定义字段以保存信息
这就是你将完全控制共享内容以及多个组件可以改变它的内容
此外,您可以定义getter和setter,并在更改属性时引发事件,以便不同的表单或窗口(视图)可以订阅更改并相应地执行操作