代码之家  ›  专栏  ›  技术社区  ›  kpollock

在构造函数中传递对“this”的引用

  •  8
  • kpollock  · 技术社区  · 17 年前

    我知道我以前做过这件事,但我想我的构造器执行顺序有点扭曲……

    public class Class1
    {
        Class2 _class2;
    
        public Class1()
        {
            _class2 = new Class2(this);
        }
    }
    
    public class Class2 
    {
        Class1 _parent; //corrected typo
    
        public Class2(Class1 parent)
        {
            _parent = parent;
        }
    }
    

    问题是,父级总是以空结尾。

    正确的方法是什么?(也许我可以把我的迟钝归咎于感冒……)

    编辑以更正拼写错误(这在真正的代码中不是问题!)

    5 回复  |  直到 10 年前
        1
  •  9
  •   Reed Copsey    17 年前

    从技术上讲,这应该是可行的,前提是您将Class2更改为 this.parent = parent;

    不过,我不推荐这样做。相反,我建议您在Class1中延迟初始化Class2实例。根据在Class2的构造函数中所做的一切,您可能会导致自己陷入险境。

    在Class1上生成Class2属性并延迟初始化它将导致在Class1的构造函数完成后构建Class2,而不是在它的构造过程中,如果您的类变得更复杂,则很可能不会出错。

        2
  •  10
  •   Keltex    17 年前

    您可能输入了错误的代码,但我认为您希望将此定义用于Class2(注意 Class2构造函数中的限定符):

    public class Class2 
    {
        Class1 parent;
    
        public Class2(Class1 parent)
        {
            this.parent = parent;
        }
    }  
    
        3
  •  2
  •   geowa4    17 年前
    Class1 parent;
    _parent = parent;
    

    _父级从未定义;您拼写错误。

        4
  •  0
  •   galets    17 年前
        5
  •  0
  •   Izzy    10 年前

    我知道这是一个老问题,但我想我会把我的两分钱投进去。谷歌把我带到这里,这样它就可以把其他人带到这里。

    这看起来像是循环依赖…有两个相互使用/引用的独立类,这就是代码的味道。

    如果要为对象建立父子关系,请考虑为类创建二进制树实现(或类似实现)。

    如果要利用类继承,请正确使用它> Class2 是的基类 Class1 你的 第一类 声明将是 public class Class1 : Class2 . 你可以参考 第二类 的方法 第一类 base 关键字。

    所以简而言之,这个答案是:你需要重新设计你的类以更好地适应你想要完成的任务,而不是与编译器做一些比它需要的更混乱的事情。

    尤其是你要测试的代码可能是新的 第一类 ,然后查询该对象以引用 第二类 的引用 第一类 …这是毫无意义的。

    附录2:

    语义上, 第一类 可改写如下:

    public class Class1
    {
        Class2 _class2;
    
        public Class1()
            :this(new Class2(this))
        {
        }
        public Class1(Class2 class2)
        {
            _class2 = class2;
        }
    }
    

    …但它不能,因为 :this(new Class2(this)) 是正确的语法错误。这也正是你所做的。请不要这样。