代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

我如何才能强迫一个C构造函数成为一个工厂?

  •  0
  • Edward Tanguay  · 技术社区  · 16 年前

    下面的代码包括 两个班 :

    • 智能表格 (简单模型类)
    • 智能表格 (包含以下集合的复数类 智能表格 对象)

    我想能够实例化单数和复数类 这样地 (即,我不需要工厂方法getSmartForm()):

    SmartForms smartForms = new SmartForms("all");
    SmartForm smartForm = new SmartForm("id = 34");
    

    为了整合逻辑, 只有复数类才能访问数据库 . 当要求单数类实例化自身时,它将简单地实例化复数类,然后从复数对象集合中选择一个对象,然后 成为那个对象 .

    我该怎么做? 我试图将对象分配给 this 这不管用。

    using System.Collections.Generic;
    
    namespace TestFactory234
    {
        public class Program
        {
            static void Main(string[] args)
            {
                SmartForms smartForms = new SmartForms("all");
                SmartForm smartForm = new SmartForm("id = 34");
            }
        }
    
        public class SmartForm
        {
            private string _loadCode;
    
            public string IdCode { get; set; }
            public string Title { get; set; }
    
            public SmartForm() {}
    
            public SmartForm(string loadCode)
            {
                _loadCode = loadCode;
                SmartForms smartForms = new SmartForms(_loadCode);
                //this = smartForms.Collection[0]; //PSEUDO-CODE
            }
    
        }
    
        public class SmartForms
        {
            private string _loadCode;
    
            public List<SmartForm> _collection = new List<SmartForm>();
            public List<SmartForm> Collection
            {
                get
                {
                    return _collection;
                }
            }
    
            public SmartForms(string loadCode)
            {
                _loadCode = loadCode;
                Load();
            }
    
            //fills internal collection from data source, based on "load code"
            private void Load()
            {
                switch (_loadCode)
                {
                    case "all":
                        SmartForm smartFormA = new SmartForm { IdCode = "customerMain", Title = "Customer Main" };
                        SmartForm smartFormB = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                        SmartForm smartFormC = new SmartForm { IdCode = "customerMain3", Title = "Customer Main3" };
                        _collection.Add(smartFormA);
                        _collection.Add(smartFormB);
                        _collection.Add(smartFormC);
                        break;
                    case "id = 34":
                        SmartForm smartForm2 = new SmartForm { IdCode = "customerMain2", Title = "Customer Main2" };
                        _collection.Add(smartForm2);
                        break;
                    default:
                        break;
                }
            }
        }
    }
    
    5 回复  |  直到 16 年前
        1
  •  4
  •   Tadmas    16 年前

    它不必是完全相同的对象,它只需在外部观察者看来是相同的。如果您将所有数据从一个对象复制到另一个对象,它将完成相同的事情。

    public SmartForm(string loadCode)
    {
        _loadCode = loadCode;
        SmartForms smartForms = new SmartForms(_loadCode);
        this.IdCode = smartForms[0].IdCode;
        this.Title = smartForms[0].Title;
    }
    
        2
  •  7
  •   Jon Skeet    16 年前

    你不能让一个物体“变成”另一个物体。

    使用静态方法而不是构造函数(并将构造函数设为私有/内部/任何类型,以便只有静态方法可以访问它们)。与构造函数相比,使用静态方法有许多好处:

    • 如果合适,可以返回空值
    • 如果合适,可以返回现有对象
    • 你可以做很多工作 然后 调用只设置字段的简单构造函数

    缺点是它们不适用于C集合/对象初始值设定项:(

    静态方法的另一种选择是拥有一个单独的工厂,并对其调用实例方法。

        3
  •  3
  •   Thorarin    16 年前

    你不能。微软通过定义一个公共的静态create()方法来实现这一点。请参见System.NET命名空间中的webRequest和httpwebRequest示例。我建议你也这么做。

    将基类的构造函数设为内部或私有,因此它不能直接实例化。或者更好的是,把它变成一个抽象类。在create()实现中使用隐藏的构造函数。

        4
  •  2
  •   Lucas Jones    16 年前

    你可以用一个 internal protected 构造函数的修饰符,而不是 public . 这样:

    public SmartForm() {}
    public SmartForm(string loadCode)
    {
        _loadCode = loadCode;
        SmartForms smartForms = new SmartForms(_loadCode);
        //this = smartForms.Collection[0]; //PSEUDO-CODE
    }
    

    变成:

    internal SmartForm() {}
    internal SmartForm(string loadCode)
    {
        _loadCode = loadCode;
        SmartForms smartForms = new SmartForms(_loadCode);
        //this = smartForms.Collection[0]; //PSEUDO-CODE
    }
    
        5
  •  0
  •   SLaks    16 年前

    你可以安排一个叫 SmartFormData ,并将所有值放入其中。

    使 SmartForms 复数类维护这些对象的集合,并使 SmartForm 单一构造函数在中查找正确的smartformdata实例 智能表格 复数的

    然后,将所有属性 智能表格 奇异值从 智能表格数据

    但是,最好的方法是拥有一个私有的构造函数并使用工厂方法。

    是否有必要使用构造函数?