代码下面的由 两个班:

  • 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;
            }
        }
    }
}
有帮助吗?

解决方案

它没有被完全相同的目的,它只是看起来是相同的外部观察员。如果你的副本所有的数据从一个物体到另一个,它将完成同样的事情。

public SmartForm(string loadCode)
{
    _loadCode = loadCode;
    SmartForms smartForms = new SmartForms(_loadCode);
    this.IdCode = smartForms[0].IdCode;
    this.Title = smartForms[0].Title;
}

其他提示

你不能得到一个对象"成为"另一个。

使用静态的方法,而不是构造(和使造私人/内部/管如此,只有静态的方法可以访问)。有许多好处,以使用的是静态的方法,超过构造:

  • 你可以返回空,如果合适
  • 你可以返回的一个现有的对象,如果合适
  • 你可以做大量的工作, 然后 呼叫一个简单的构造,只是集领域

缺点是他们不工作C#收对象的初始:(

一种替代以静态的方法(其中不工作,以及与依赖注射,不可否认)是有一个单独的工厂,并呼吁实例的方法。

您不能。Microsoft会通过界定公共静Create()方法来代替。例如,见问福汇,他们说和HttpWebRequest在System.Net 名字空间。我建议你也这样做。

使基类的构造内部的或是私人的,所以它不能直接实例化。或者更好,使它成为一个抽象的类。使用的隐藏的构造你的Create()实施。

你可以使用 internalprotected 修改的构造,而不是的 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
}

你可以做一个私人类所谓的 SmartFormData, 和把所有的价值观纳入它。

SmartForms 多类保持一个收集那些对象,并使 SmartForm 奇异构造找到正确的SmartFormData实例 SmartForms 复数。

然后,使所有的属性 SmartForm 奇取回他们的价值观从 SmartFormData

然而,最好的方式做到这一点是有私人的构造和使用工厂的方法。

还有一个原因,你必须使用一种构造?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top