我有两个类定义如下。
第一个:
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)?
答案 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
需要Master
而Master
无法生效Content
。
通过我为您制作的解决方案,您可以执行以下操作:
void Main()
{
Master M1 = new Master(); // content instantiated implicitly
Master M2 = new Content().master; // master instantiated implicitly
}
因此,您可以实例化实例化中的Master
和Content
,反之亦然:实例化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;
}
}
请注意,我尽可能地保留了您在问题中给出的结构,而您现在拥有额外的灵活性。