c# - 从 Constructor 调用一个工厂得到新版本的 "this"

标签 c# constructor

我可能会倒退...... 我有一个类似于文档的类和另一个类似于模板的类。它们都继承自同一个基类,我有一个方法可以从模板创建新文档(或从另一个文档,它在基类中的方法)。 因此,如果我想从模板创建一个新文档,我只需实例化该模板并对其调用 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/

相关文章:

c# - ASP.NET MVC4 Twitter Bootstrap 单选按钮问题

c# - WebClient 是否使用 KeepAlive?

c# - 为什么此代码会导致 Visual Studio 2015 崩溃?

c# - 如何判断一个构造函数是否被另一个构造函数调用?

C++构造函数问题(linux)

c# - 使用 LINQ 基于多个参数进行过滤?

c# - 获取 IP 地址而不是 MAC 地址

generics - 单个构造函数的通用边界

c++ - 复制构造函数的调用

C++ 为什么这些构造函数调用中有 3 个有效,而一个无效?