我知道我之前已经完成了这项工作,但我认为我的构造函数的执行顺序是我认为....
public class Class1
{
Class2 _class2;
public Class1()
{
_class2 = new Class2(this);
}
}
public class Class2
{
Class1 _parent; //corrected typo
public Class2(Class1 parent)
{
_parent = parent;
}
}
麻烦的是,父总是以null结束。
这样做的正确方法是什么? (也许我可以归咎于我患感冒的缓慢......)
编辑以纠正TYPO(这不是真正的代码中的问题!)
答案 0 :(得分:10)
您可能输错了代码,但我认为您想要Class2的这个定义(请注意Class2构造函数中的 this 限定符):
public class Class2
{
Class1 parent;
public Class2(Class1 parent)
{
this.parent = parent;
}
}
答案 1 :(得分:9)
如果您更改Class2以包含this.parent = parent;
但是,我不建议这样做。相反,我会建议在class1中初始化class2实例。根据Class2构造函数中的所有操作,您可能会导致自己陷入恶劣的境地。
在class1上创建Class2属性并且延迟初始化它会导致在Class1的构造函数完成之后构造Class2,而不是在构造期间构造,如果你的类变得更复杂,那么很可能不容易出错。
答案 2 :(得分:2)
Class1 parent;
_parent = parent;
永远不会定义_parent;你把它拼错了。
答案 3 :(得分:1)
我知道这是一个古老的问题,但我认为我会把我的两分钱扔进去。谷歌把我带到这里,所以它可能会带来其他人。
这可疑看起来像一个循环依赖...它有两个独立的类使用/引用彼此的代码气味。
如果您想拥有对象的父/子关系,请考虑为您的类创建二叉树实现(或类似)。
如果您想利用类继承,请正确使用>
Class2
是Class1
的基类,您的Class1
声明为public class Class1 : Class2
。您可以使用Class2
关键字在Class1
中引用base
方法。
简而言之,这个答案是:你需要重新设计你的课程以更好地适应你想要完成的事情,而不是让编译器去做一些比它需要的更令人困惑的事情。 。
特别是因为您要对此进行测试的代码可能正在新增Class1
,然后查询该对象以引用Class2
对{Class1
的引用1}} ......这绝对没有意义。
Append2:
从语义上讲,Class1
可以按如下方式重写:
public class Class1
{
Class2 _class2;
public Class1()
:this(new Class2(this))
{
}
public Class1(Class2 class2)
{
_class2 = class2;
}
}
...除了它之外,因为:this(new Class2(this))
语法是正确的。它也正是你正在做的事情。请不要。
答案 4 :(得分:0)
我不明白为什么这不起作用。它适用于我。
宣称: http://vvcap.net/db/I2OZoapbIRREvQ8ymPym.htp