在构造类的新实例时,如何避免传递对父对象的引用?

时间:2012-07-23 08:09:31

标签: c# class object constructor

我有两个类定义如下。

第一个:

internal class Content {

   internal Content(Master master) {
        // code omitted
   }

// code omitted
}
第二个:

public class Master {

     internal Content content { get; set; }

     internal Master() {
         // code omitted
     }

// code omitted
}

将Content Class公开为Master的属性我需要做这样的事情:

Master M = new Master(); 
M.content = new Content(M); 

有没有办法在Content Consctructor中传递Master(M)?

3 个答案:

答案 0 :(得分:4)

大概Content 需要一个Master?实际上,构造函数是管理它的一种相当好的方法,但如果这是一个问题,你也可以做类似的事情:

internal class Content {
    internal void SetMaster(Master master) {this.master = master; }
    //...
}
internal class Master {
    internal void SetContent(Content content) {
        if(content == null) throw new ArgumentNullException("content");
        // maybe handle double-calls...
        this.content = content;
        content.SetMaster(this);
    }
}
...
Master M = new Master();
M.SetContent(new Content());

或默认情况下Master创建Content。坦率地说,我会“按原样”保留它,直到实际存在“这是一个问题”。

答案 1 :(得分:3)

为什么不使用延迟初始化idom?

public class Master
{
    private Content _content;

    internal Content content
    {
        get
        {
            if (_content == null)
            {
                _content = new Content(this);
            }
            return _content;
        }
    }
}

如果Master始终必须设置content属性,请在构建期间创建Content成员:

public class Master
{
    internal Content content
    {
        get; private set;
    }

    internal Master()
    {
        content = new Content(this);
    }
}

您也可以使用混合方法:

public class Master
{
    internal Content content
    {
        get; private set;
    }

    internal Content GetOrCreateContent()
    {
        if (content == null)
        {
            content = new Content(this);
        }
        return content;
    }

    internal Master()
    {
    }
}

答案 2 :(得分:1)

由于未显示类中的代码,因此我必须假设您打算做什么。正如我从您的代码中看到的那样,Content需要MasterMaster无法生效Content

通过我为您制作的解决方案,您可以执行以下操作:

void Main()
{
    Master M1 = new Master(); // content instantiated implicitly
    Master M2 = new Content().master; // master instantiated implicitly
}

因此,您可以实例化实例化中的MasterContent,反之亦然:实例化Content并隐式实例化Master

无论您选择哪种替代方案:相应的其他对象始终通过属性变量进行实例化并可用。

此示例中的类定义如下:

internal class Content  {  

    internal Master master { get; set; }

    internal Content(Master pmaster) {     
        master=pmaster;
    }

    internal Content() {     
        master = new Master() { content = this };
    }  
}

public class Master {  

    internal Content content { get; set; }  

    internal Master() {     
        content = new Content(this);
    }  

    // this is optional and can be omitted, if not needed:  
    internal Master(Content pcontent) {     
        content = pcontent;
    }  
} 

请注意,我尽可能地保留了您在问题中给出的结构,而您现在拥有额外的灵活性。