簡體   English   中英

如何強制C#構造函數成為工廠?

[英]How can I force a C# constructor to be a factory?

下面的代碼包含兩個類

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

您無法讓一個對象“成為”另一個對象。

使用靜態方法而不是構造函數(並使構造函數私有/內部/任何形式,以便只有靜態方法才能訪問它們)。 在構造函數上使用靜態方法有很多好處:

  • 您可以根據需要返回null
  • 您可以根據需要返回現有對象
  • 您可以做很多工作, 然后調用一個簡單的構造方法來設置字段

缺點是它們不適用於C#集合/對象初始值設定項:(

靜態方法的一種替代方法(誠然,它不能很好地與依賴項注入配合使用)是擁有一個單獨的工廠並在其上調用實例方法。

它不必是完全相同的對象,它只需要看起來對外部觀察者是相同的即可。 如果將所有數據從一個對象復制到另一個對象,它將完成同一件事。

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

你不能。 Microsoft通過定義一個公共的靜態Create()方法來做到這一點。 例如,請參閱System.Net命名空間中的WebRequest和HttpWebRequest。 我建議你這樣做。

將基類的構造函數設置為內部或私有,因此無法直接實例化。 或更妙的是,使其成為抽象類。 在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單數構造函數在SmartForms復數中找到正確的SmartFormData實例。

然后,使SmartForm所有屬性SmartForm奇異,以從SmartFormData獲取它們的值。

但是,最好的方法是擁有私有構造函數並使用工廠方法。

是否有理由必須使用構造函數?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM