我可能会倒退...... 我有一个类似于文档的类和另一个类似于模板的类。它们都继承自同一个基类,我有一个方法可以从模板创建新文档(或从另一个文档,它在基类中的方法)。 因此,如果我想从模板创建一个新文档,我只需实例化该模板并对其调用 GetNewDoc();
Document doc = mytemplate.GetNewDoc();
在 Document 类中,我有一个创建新的空白文档的空白构造函数,以及另一个采用文档 ID 的构造函数,以便我可以从数据库加载文档。但是,我还想要一个采用模板 ID 的构造函数。这样我可以做到
Document doc = New Document(TemplateID)
因为模板类已经具有返回文档的能力,所以我希望构造函数做类似的事情
Template temp = new Template(TemplateID);
this = temp.GetNewDoc();
当然,我不能这样做,因为“this”是只读的——而且感觉很奇怪。我觉得我在这里很愚蠢,所以请随意大喊 :)
问题是所讨论的对象非常复杂,有多个子对象集合和多个表的数据库持久性,所以我不想重复太多代码。不过,我想我可以从模板中获取新文档,然后复制字段/属性,因为集合应该很容易跟随 - 这看起来像是重复。
更详细的代码示例:
使用系统;
使用 System.Collections.Generic;
使用系统文本;
命名空间测试
{
类(class)计划
{
静态无效主要(字符串[]参数)
{
//这只是创建对象并赋值
实例 inst = new Instance();
inst.name = "手动创建";
Console.WriteLine("直接: {0}", inst.name);
//这直接从模板创建一个新实例
MyTemplate def = new MyTemplate();
实例 inst2 = def.GetInstance(100);
Console.WriteLine("直接来自模板:{0}", inst2.name);
实例 inst3 = 新实例(101);
Console.WriteLine("构造函数调用了模板:{0}", inst3.name);
控制台.ReadKey();
}
}
公共(public)类实例
{
公共(public)字符串名称;
公共(public)实例(int TemplateID)
{
MyTemplate def = new MyTemplate();
//如果我取消注释这一行,构建将失败
//this = def.GetInstance(TemplateID);
}
公共(public)实例()
{
}
}
MyTemplate 类
{
公共(public)实例 GetInstance(int TemplateID)
{
实例 inst = new Instance();
//在数据库中查找模板并获取一些值
inst.name = String.Format("来自模板:{0}", TemplateID.ToString());
返回安装;
}
}
}
最佳答案
如果除了仅从构造函数中的代码创建新对象之外,您还想做任何其他事情,请首先不要使用构造函数。
你真的需要一个接受 int 的实例构造函数吗?为什么不把它变成静态工厂方法:
public static Instance CreateInstance(int id)
{
MyTemplate def = new MyTemplate();
return def.GetInstance(id);
}
与构造函数相比,静态方法有许多优点 - 尽管也有一些缺点。 (上面有一个 separate SO question - 值得一看。)
关于c# - 从 Constructor 调用一个工厂得到新版本的 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/324341/