无论如何,我的代码看起来像这样:
SystemOutput systemOutput = null;
SystemCL system = null;
WindowsForm wf = null;
wf = new WindowsForm(system);
systemOutput = new SystemOutput(wf);
system = new SystemCL(systemOutput, wf);
其余的代码对于解决我的问题并不重要(我想?)
因为您可以看到对象相互引用,这意味着如果其他对象尚未初始化,则会给我一个错误。所以我首先尝试将它们设为null,但现在第一个对象获得nullreferencepointer,因为该对象为null。
如何解决这个难题?有更好的方法吗?
注意What is a NullReferenceException, and how do I fix it?不包括这种情况。
答案 0 :(得分:1)
答案是首先不创造谜题。不要创建循环引用,例如WindowsForm
取决于SystemCL
,SystemOutput
取决于WindowsForm
,然后SystemCL
取决于它们。
不要将它视为如何使这些类按照设计工作的难题。难题是如何以不同的方式设计它们,以便它们不会以这种方式相互依赖。
在不知道课程实际做什么的情况下,我可以得到详细信息。
面向对象编程的大多数复杂性决定了类将如何依赖于其他类。或者,如果您正在处理其他人的代码,那么它会确定哪些类依赖于其他类。实现这一目标是IMO OOP最重要的方面之一。
我认为当一个类依赖于另一个类时,将对象传递给其他对象的构造函数是正确的。这是一个很好的做法。下一步是找出每个类中的属性,这样它们就不需要循环地相互依赖。
答案 1 :(得分:0)
首先 - 最好重新设计类以避免循环引用。请参阅https://softwareengineering.stackexchange.com/questions/11856/whats-wrong-with-circular-references进行讨论。
如果必须有这样的引用(即具有父/子关系的构建树),则其中一个对象必须提供延迟设置其中一个关系引用的方法。
最简单 - 公开属性并在构造其他对象后稍后设置:
wf = new WindowsForm(/*nothing*/);
systemOutput = new SystemOutput(wf);
system = new SystemCL(systemOutput, wf);
wf.SetSystem(system); // method to make it less tempting to set later
还有多种方法可以使它更安全(工厂,添加时构建对象,......),甚至包括immutable trees。