3

我可能会倒退……我有一个类似于文档的类和另一个类似于模板的类。它们都继承自同一个基类,我有一个从模板(或从另一个文档,它在基类中的方法)创建新文档的方法。因此,如果我想从模板创建一个新文档,我只需实例化模板并在其上调用 GetNewDoc();

Document doc = mytemplate.GetNewDoc();

在 Document 类中,我有一个空白构造函数来创建一个新的空白文档,以及另一个接受文档 ID 的构造函数,这样我就可以从数据库中加载文档。但是,我还想要一个带有模板 ID 的构造函数。这样我可以做到

Document doc = New Document(TemplateID)

因为模板类已经有能力返回一个文档,我希望构造函数做类似的事情

Template temp = new Template(TemplateID);
this = temp.GetNewDoc();

当然,我不能这样做,因为“this”是只读的——而且感觉很奇怪。我觉得我在这里很愚蠢,所以请随意大喊:)

问题是有问题的对象非常复杂,有几个子对象集合和多个表上的数据库持久性,所以我不想复制太多代码。不过,我想我可以从模板中获取新文档,然后复制字段/属性,因为集合应该很容易遵循 - 这看起来像是重复。

更详细的代码示例:

using System;
using System.Collections.Generic;
using System.Text;

namespace Test
{
class Program
{
    static void Main(string[] args)
    {
        // This just creates the object and assigns a value
        Instance inst = new Instance();
        inst.name = "Manually created";
        Console.WriteLine("Direct: {0}", inst.name);

        //This creates a new instance directly from a template
        MyTemplate def = new MyTemplate();
        Instance inst2 = def.GetInstance(100);
        Console.WriteLine("Direct from template: {0}", inst2.name);

        Instance inst3 = new Instance(101);
        Console.WriteLine("Constructor called the template: {0}", inst3.name);
        Console.ReadKey();

    }
}

public class Instance
{
    public string name;

    public Instance(int TemplateID)
    {
        MyTemplate def = new MyTemplate();
        //If I uncomment this line the build will fail
        //this = def.GetInstance(TemplateID);
    }

    public Instance()
    {
    }
}

class MyTemplate
{
    public Instance GetInstance(int TemplateID)
    {
        Instance inst = new Instance();
        //Find the template in the DB and get some values
        inst.name = String.Format("From template: {0}", TemplateID.ToString());
        return inst;
    }
}
}

4

3 回答 3

7

如果您希望能够仅从构造函数中的代码创建新对象以外的任何事情,请不要首先使用构造函数。

你真的需要一个带有 int 的 Instance 构造函数吗?为什么不把它变成静态工厂方法:

public static Instance CreateInstance(int id)
{
    MyTemplate def = new MyTemplate();
    return def.GetInstance(id);
}

静态方法相对于构造函数有很多优点——尽管也有一些缺点。(对此有一个单独的 SO 问题- 值得一看。)

于 2008-11-27T17:55:00.787 回答
2

您不能从构造函数或任何其他方法重新创建“this”。您可以创建另一个对象并复制内容,但我会将工厂公开。定义一个具有三个 createDocument() 方法的工厂类,一个用于空白文档,一个用于来自数据库的文档,第三个来自模板:

public class Factory {
   public static Document createBlankDocument();
   public static Document createDocument( DocumentId id );
   public static Document createDocumentFromTemplate( TemplateId id );
}
于 2008-11-27T17:57:26.617 回答
0

我和 Jon 在一起,使用工厂方法要好得多,因为这对开发人员来说非常清楚正在发生的事情(不仅仅是创建一个新对象)。

工厂方法对程序员说,“这里发生了一些特殊的初始化,使用new不够好”。

通常,当您想要回收或缓存资源时,您会使用工厂,相反,当您使用new关键字时,您不会期望回收或缓存的资源;你期待一个全新的资源(它直接融入关键字):)

于 2008-11-27T18:41:00.930 回答