当前位置:  开发笔记 > 编程语言 > 正文

从Constructor调用工厂以获取"this"的新版本

如何解决《从Constructor调用工厂以获取"this"的新版本》经验,为你挑选了1个好方法。

我可能会向后看这个...我有一个类似于文档的类和另一个类似模板的类.它们都从相同的基类继承而且我有一个方法来从模板(或从另一个文档,它在基类中的方法)创建一个新文档.所以,如果我想从模板创建一个新文档,我只是实例化模板并在其上调用GetNewDoc();

Document doc = mytemplate.GetNewDoc();

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

Document doc = New Document(TemplateID)

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

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

当然,我不能这样做,因为"这个"是只读的 - 无论如何它感觉很奇怪.我有一种感觉,我在这里非常愚蠢,所以随意喊:)

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

一个更精细的代码示例:

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



1> Jon Skeet..:

如果您希望除了从构造函数中的代码创建新对象之外还能执行任何操作,请不要首先使用构造函数.

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

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

静态方法比构造函数具有各种优点 - 尽管也存在一些缺点.(有一个单独的SO问题 - 值得一看.)

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有