C# 在C语言中,对象是否可以将对自身的引用传递给它在其中创建的子对象的构造函数';谁有自己的基构造函数?

C# 在C语言中,对象是否可以将对自身的引用传递给它在其中创建的子对象的构造函数';谁有自己的基构造函数?,c#,C#,假设我有以下对象: public abstract class Chicken { public Egg Container { get; private set; } protected Chicken(Egg container) { Container = container; } } public abstract class Egg { public Chicken Contents { get; private set; }

假设我有以下对象:

public abstract class Chicken
{
    public Egg Container { get; private set; }

    protected Chicken(Egg container)
    {
        Container = container;
    }
}

public abstract class Egg
{
    public Chicken Contents { get; private set; }

    protected Egg(Chicken contents)
    {
        Contents = contents;
    }
}

public class Buckeye : Chicken
{
    public Buckeye(Egg container) : base(container)
    {

    }
}

public class BrownEgg : Egg
{
    public BrownEgg() : base(new Buckeye(this))
    {

    }
}
感谢维基百科提供了一个鸡品种的名称

无论如何,前面的代码不会编译。它将告诉您“不能在成员初始值设定项中使用'this'

所以,我想知道是否有办法做到这一点。是否可以将对正在构造的对象的引用传递给也正在构造的子对象,该子对象需要传递给外部对象库


我可能把问题的标题写得很糟糕,但这是一个很难简明扼要地表达的概念。

不,原因如下:基本构造函数在更派生的构造函数之前触发,但基本构造函数会根据更派生的类来操作。
。。。它在构造时没有完成,因为它正在等待基构造函数完成,然后再触发派生构造函数。我不确定我写它的方式是否有意义,但基本上你不能将未构造的类传递给基类。

没有,原因如下:基类构造函数在你的更派生类之前触发,但基类构造函数会对你的更派生类起作用。。。它在构造时没有完成,因为它正在等待基构造函数完成,然后再触发派生构造函数。我不确定我是如何编写它的,但基本上你不能将未构造的类传递给基类。

你不能在调用基类构造函数时使用
这个
(请参阅)

您可以传递creator函数而不是填充的对象,以让内部构造函数传递
this
。比如:

protected Egg(Func<Egg, Chicken> contentsCreator) 
{
   Contents = contentsCreator(this);
}

public BrownEgg() : base(me => new Buckeye(me))
{
}
protectedegg(Func contentsCreator)
{
Contents=contentsCreator(此);
}
public BrownEgg():base(me=>new Buckeye(me))
{
}

在调用基本构造函数时不能使用
(请参阅)

您可以传递creator函数而不是填充的对象,以让内部构造函数传递
this
。比如:

protected Egg(Func<Egg, Chicken> contentsCreator) 
{
   Contents = contentsCreator(this);
}

public BrownEgg() : base(me => new Buckeye(me))
{
}
protectedegg(Func contentsCreator)
{
Contents=contentsCreator(此);
}
public BrownEgg():base(me=>new Buckeye(me))
{
}


这几乎没有任何意义。我想,你可以创建一个不接受另一个对象的私有构造函数,并使用这个私有构造函数创建一个静态工厂方法。这个想法只是让鸡蛋知道它的内容,让小鸡知道它的容器。@Telarian-你需要做两个阶段的初始化。考虑C.WiFrices如何做事情——你构建一个容器,构造一个容器,然后将容器添加到容器中。如果你第一次将它转换到基类,你能把它传递给基类构造器吗?这几乎没有任何意义。我想,你可以创建一个不接受另一个对象的私有构造函数,并使用这个私有构造函数创建一个静态工厂方法。这个想法只是让鸡蛋知道它的内容,让小鸡知道它的容器。@Telarian-你需要做两个阶段的初始化。考虑C.WiFrimes如何做事情——你构建一个容器,构造一个容器,然后将容器添加到容器中。如果你第一次将它转换到基类,你能把它传递给基类构造函数吗?所以,派生的类型必须处理它本身。不幸的是,我看不到任何方法来确保它能做到……事实上,现在即使它想做到也不行,因为内容设置程序是私有的……正如我所说的。目的只是让他们彼此了解。显然,对于更复杂的东西来说,这都是伪的。创建一个容器类,将
Chicken
Egg
作为构造函数,并可能促进它们之间的通信?因此我想派生类型必须自己处理它。不幸的是,我看不到任何方法来确保它能做到……事实上,现在即使它想做到也不行,因为内容设置程序是私有的……正如我所说的。目的只是让他们彼此了解。显然,对于更复杂的东西来说,这都是伪的。创建一个容器类,将
Chicken
Egg
作为构造函数,并可能促进它们之间的通信?这是一个非常有趣的可能性。也许很精彩。我将对此进行调查。@Telarian只要确保你在一个月内尝试阅读此类代码时头部不会爆炸:)嘿,是的,可能会有一些广泛的评论order@Telarian我不明白为什么在我的建议中,基类(Egg)需要了解有关派生类的任何信息<代码>函数
?(或者我误解了你的评论)。事实上,我只是误解了我自己对伪代码到真代码的翻译。它工作得很好。是的,有点让人困惑,但评论可以解决这个问题。谢谢你的好主意。这是一个非常有趣的可能性。也许很精彩。我将对此进行调查。@Telarian只要确保你在一个月内尝试阅读此类代码时头部不会爆炸:)嘿,是的,可能会有一些广泛的评论order@Telarian我不明白为什么在我的建议中,基类(Egg)需要了解有关派生类的任何信息<代码>函数
?(或者我误解了你的评论)。事实上,我只是误解了我自己对伪代码到真代码的翻译。它工作得很好。是的,有点让人困惑,但评论可以解决这个问题。谢谢你的好主意。