0

下面的代码由两个类组成:

  • SmartForm(简单模型类)
  • SmartForms(包含SmartForm对象集合的复数类)

我希望能够像这样实例化单数和复数类(即我不想要工厂方法 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;
            }
        }
    }
}
4

5 回答 5

7

你不能让一个对象“变成”另一个对象。

使用静态方法而不是构造函数(并将构造函数设为私有/内部/其他,以便只有静态方法可以访问它们)。使用静态方法而不是构造函数有很多好处:

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

缺点是它们不适用于 C# 集合/对象初始化器:(

静态方法的替代方法(不可否认,它不适用于依赖注入)是拥有一个单独的工厂并在其上调用实例方法。

于 2009-06-09T15:15:49.033 回答
4

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

public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    this.IdCode = smartForms[0].IdCode;
    this.Title = smartForms[0].Title;
}
于 2009-06-09T15:18:34.630 回答
3

你不能。Microsoft 通过定义一个公共静态 Create() 方法来做到这一点。例如,参见 System.Net 命名空间中的 WebRequest 和 HttpWebRequest。我建议你这样做。

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

于 2009-06-09T15:16:49.313 回答
2

您可以对构造函数使用internalorprotected修饰符,而不是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
}
于 2009-06-09T15:14:08.507 回答
0

您可以创建一个名为 的私有类SmartFormData,并将所有值放入其中。

使SmartForms复数类维护这些对象的集合,并使单数构造函数以复数形式SmartForm找到正确的 SmartFormData 实例。SmartForms

然后,使所有的SmartForm单数属性从SmartFormData

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

是否有理由必须使用构造函数?

于 2009-06-09T17:46:10.667 回答