4

我有两个类定义如下。

第一:

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 Constructor 中不通过 Master(M)?

4

3 回答 3

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。不过,坦率地说,我会“按原样”保留它,直到出现真正的“这是一个问题”。

于 2012-07-23T08:14:49.670 回答
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()
    {
    }
}
于 2012-07-23T08:14:36.803 回答
1

由于未显示类中的代码,因此我必须对您打算做什么做出一些假设。正如我从您的代码中看到的那样,Content需要 aMaster并且Master没有Content.

使用我为您制定的解决方案,您可以执行以下操作:

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

因此,您可以实例化 theMasterContentwithin 实例化,反之亦然:实例化 aContent和 theMaster隐式实例化。

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

本例中的类定义如下:

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;
    }  
} 

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

于 2012-07-23T08:47:35.510 回答